C++类与对象的示例分析(C++,开发技术)

时间:2024-05-03 16:14:03 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

类的引入

在引入类之前,先来回忆一下C语言中的结构体。结构体是一种自定义类型,可以在其中定义变量,如我们所熟悉的日期结构体:

structDate{ intyear; intmonth; intday;};

而在C++中,结构体被升级成了类,结构体中不仅可以定义成员变量,也可以定义成员函数(成员方法):

structDate{ //成员变量 intyear; intmonth; intday; //成员方法 voidprint() { cout<<year<<"-"<<month<<"-"<<"day"<<endl; }};

在C++中,更喜欢使用class来替代struct,当然它们也有所差别,在之后会说明。

类的定义

类的定义可以分为两种,即声明和定义全部放在类体中与声明与定义分离。

1、声明和定义全部放在类体中

该方式即为上一举例代码的定义方式。但要注意,如果采用这种方法定义成员函数,编译器可能会将该函数作为内联函数处理。

2、声明放在头文件,定义放在源文件中

头文件中成员函数只需要声明:

structDate{ //成员变量 intyear; intmonth; intday; //成员方法 voidprint();};

在源文件中对函数进行定义:

voidDate::print(){ cout<<year<<"-"<<month<<"-"<<"day"<<endl;}

需要注意,print为类域中的函数,如果不加Date::用以指定类域,会导致定义出错。因此,使用该方式定义成员函数时,一定要注意指定类域。

类的访问限定符号及封装

访问限定符

访问限定符分为三种:

C++类与对象的示例分析

(1)public修饰的成员在类外可以直接被访问:

classDate{public: intyear; intmonth; intday; voidprint() { cout<<year<<"-"<<month<<"-"<<"day"<<endl; }};intmain(){ Datedate; date.day=0;}

如上代码,在main函数中可以直接对对象中的成员变量day进行访问。

(2)protected和private修饰的成员变量在类外不能被直接访问

classDate{private: intyear; intmonth; intday; voidprint() { cout<<year<<"-"<<month<<"-"<<"day"<<endl; }};intmain(){ Datedate; date.day=0;}

此时如果在main函数中对直接对象中的成员变量day进行访问,会导致错误

C++类与对象的示例分析

(3)访问权限作用域是从该访问限定符的位置开始直到下一个访问限定符出现时为止

classDate{private: intyear; intmonth; intday;public: voidprint() { cout<<year<<"-"<<month<<"-"<<"day"<<endl; }};

如上代码,成员变量均为私有的,而成员函数print为公有的。

(4)class的默认访问权限(即不写访问限定符时)为private,struct为public

封装

封装实际上是一种更好的严格管理

将数据和方法封装到类里,可以访问的定义为共有,不想给他人访问的定义为私有或保护。如此一来就做到了隐藏对象的属性和细节,仅仅对外公开接口来和对象进行交互,更加安全高效。

类的实例化

所谓类的实例化,简而言之就是用类类型创建对象的过程。

打个比方,类就好似建筑的图纸,而对象就是根据图纸造出的建筑。对象是真实存在摸得着的,只有实例化出的对象才能够实际存储数据。

类对象模型

学过C语言我们知道如何计算结构体的大小,那么在C++中,类的大小如何确定呢?

我们所不清楚的,就是类中成员函数的大小如何计算。实事上对于同一类的不同对象,处理问题的方法是相同的,如果每个对象都要保存一遍成员方法,未免有些过于浪费空间了。

因此在C++中,成员函数存放在公共代码段。计算类的大小只需要按照C语言中结构体大小的计算规则即可,不需要考虑成员函数。

注意:空类的大小为1byte,不存储有效数据,但需要占位用以表示对象存在。

this指针

classDate{private: int_year; int_month; int_day;public: voidinit(intyear,intmonth,intday) { _year=year; _month=month; _day=day; }};intmain(){ Datedate1,date2; date1.init(2022,2,14); date2.init(2022,2,15);}

对于上述代码,有一个问题,date1与date2这两个对象分别都调用了init进行初始化,那么init函数是如何区分该为哪个对象进行初始化的呢?

C++通过引入this指针解决了这个问题。

this指针的特性

1、this指针的类型:类类型* const,存放对象的地址

2、只能在成员函数内部使用

3、this指针本质上是成员函数的形参,传参时存放在栈帧中,对象中不存储this指针

4、this指针为隐藏的形参,不需要用户传递

在上述代码实际被处理成了这样:

voidinit(intyear,intmonth,intday){ this->_year=year; this->_month=month; this->_day=day;}
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:C++类与对象的示例分析的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:JS数组在内存中效率问题的示例分析下一篇:

14 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18