类的组合
引入
在实际应用中,一个类的数据成员不仅可以是基本数据类型,还可以是其他类的对象,所以,就引入了类的组合。
类的组合
在一个类中,嵌入另一个类的对象作为数据成员,称为类的组合。该内嵌对象称为对象成员,也称为子对象。在对象的初始化中,对对象成员进行初始化时,与对基本数据成员的初始化有所不同,例如:
class A{ 类名1 对象成员1; 类名2 对象成员2; 类名3 对象成员3; ... 类名n 对象成员n; }; A::A(形参表 0):对象成员1(形参表1),对象成员2(形参表2),...,对象成员n(形参表n){ //类A的构造函数 } |
需要注意的是,在初始化内嵌的对象成员时,是按照在类中声明的顺序初始化的而非初始化列表中的顺序,析构函数的调用顺序与构造函数的调用顺序恰好相反。
说明
声明一个含有对象成员的类,首先要创建对象成员;
在初始化列表中初始化对象时,首先是按照对象在该类中的声明顺序调用对应对象的构造函数,然后才执行自己的构造函数初始化自己。而在调用析构函数时,则是相反的顺序执行。
常类型
引入
有时候,有些数据再确定之后就不允许再改变,即保证数据的安全性。所以,就引入常类型来达到这一目的。
什么是常类型
指使用类型修饰符const说明的类型,这类型的数据在程序运行期间是不可改变的。
常引用
在使用引用时使用const修饰,则被说明的引用为常引用。使用常引用作为形参,便不会对实参产生不被希望的更改。
声明格式:const 类型 & 引用名;
常对象
引入
常对象的数据成员值在对象的整个生命周期都不能被改变。说明形式如下:
类名 const 对象名[(参数表)];
或者
const类名 对象名[(参数表)];
说明
在定义对象时必须初始化,而且不能被更新;
C++不允许常对象调用普通成员函数;
常对象成员
常数据成员
如果类的数据成员声明为常类型,则构造函数初始化该数据成员时就只能通过成员初始化列表对该数据成员进行初始化,因为在函数体中通过赋值语句对常数据成员直接赋初值是不符合const修饰的数据成员的操作规则,是非法操作。例:
class Test{ private: const int year; const int month; const int day; int hour; public: Test(int y, int m, int d,int hour) :year(y), month(m), day(d) { this->hour = hour; } void display(){ cout << year << "-" << month << "-" << day << endl; } }; |
常成员函数
说明形式
类型说明符 函数名(参数表) const;
需要注意的是,const是函数类型的组成部分,在声明时和定义时都需要。但是在调用时不需要,按普通函数调用即可。
说明
一般情况下,常对象只能调用常成员函数。所以,在定义相同函数名的成员函数,一个为常成员函数,一个为普通成员函数,这时使用常对象调用这个函数时,调用是常成员函数,而使用普通对象时调用的则是普通成员函数。由此可以看出,函数重载时,const也可以作为区分的标志。
数据成员 | 普通成员函数 | 常成员函数 |
普通数据成员 | 可以访问,也可以改变其值 | 可以访问,但不可以改变其值 |
常数据成员 | 可以访问,但不可以改变其值 | 可以访问,但不可以改变其值 |
常对象的数据成员 | 不允许访问和改变其值 | 可以访问,但不允许改变值 |
常对象只能调用它的常成员函数,常对象的唯一对外接口就是常成员函数;
常成员函数不能更新对象的数据成员,也不能调用该类的普通成员函数,从而保证了在常成员函数中绝对不会更新数据成员的值。