封闭类
成员对象:一个类的成员变量是另一个类的对象。
有成员对象的类叫封闭类。
举例
class CTyre
{
private:
int radius;
int width;
public:
CTyre(int r,int w):radius(r),width(w) { } //:后面是初始化列表
};
class CEngine
{
};
class CCar // 封闭类
{
private:
int price;
cTyre tyre; // 成员对象
CEngine engine;
public:
CCar(int p,int tr,int tw); // 必须要自己定义构造函数,因为cTyre没有无参构造函数,有自定义构造函数。
};
CCar::CCar(int p,int tr,int w):price(p),tyre(tr,w) // 初始化列表
{
};
int main()
{
CCar car(20000,17,225);
return 0;
}
注意:
任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象,是如何初始化的。具体做法就是:通过封闭类的构造函数的初始化列表。
封闭类构造函数和析构函数的执行顺序:
封闭类对象生成时,先执行所有对象成员的构造函数,然后才执行封闭类的构造函数。
对象成员的构造函数调用次序和对象成员在类中的说明次序一致,与他们在成员初始化列表中出现的次序无关。
当封闭类的对象消亡时,先执行封闭类的析构函数,然后再执行成员对象的析构函数。次序和构造函数的调用次序相反。
常量对象
- 如果不希望某个对象的值被改变,就可以再定义该对象的时候在前面加const关键字。
class Demo {
private:
int value;
public:
void SetValue() {}
};
const Demo Obj; //常量对象
- 在类的成员函数说明后面可以加const关键字,则该成员函数成为常量成员函数。
注意:
常量成员函数执行期间不应该修改其所作用的对象。因此,在常量成员函数中不能修改成员变量的值(静态成员变量除外),也不能调用同类非常量成员函数,因为调用了可能会修改成员变量的值(静态成员函数除外,因为在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数)。
class Sample
{
public:
int value;
void GetValue() const //常量成员函数
void func() {};
Sample() {}
};
void Sample::GetValue() const
{
value = 0; // wrong
function(); // wrong
}
int main()
{
const Sample o; //常量对象
o.value =100; // wrong,常量对象不能被修改
o.func(); //wrong,常量对象上不能执行非常量成员函数
o.GetValue(); //right
return 0;
}
常量成员函数的重载:
两个成员函数,名字和参数表都一样,但是一个是const,一个不是,算重载。