成员对象和封闭类
- 有成员对象的类称为封闭类
- 成员对象<=>成员中有其他类的对象
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);
};
CCar::CCar(int p,int tr,int w):price(p),tyre(tr,w){};
int main()
{
CCar car(20000,17,225);
return 0;
}
- 上例中,如果CCar类不定义构造函数,则
CCar car
会编译出错 - 因为编译器不明白
car.tyre
该如何初始化,CTyre
内部的构造函数是需要参数的,你没给,所以编译出错 - 但是
car.engine
的初始化没有问题,他使用默认的无参构造函数 - 任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象是如何初始化的
- 成员对象的初始化列表中的参数可以是任意复杂的表达式,可以包括函数,变量,只要表达式中的函数或变量有意义就行
封闭类构造函数和析构函数的执行顺序
- 封闭类对象生成时,先执行所有成员对象的构造函数,然后才执行封闭类的构造函数
- 成员对象的构造函数调用次序和成员对象在类中的说明次序一致,与它们在成员初始化列表中出现的次序无关
- 当封闭类的对象消亡时,先执行封闭类的析构函数,然后执行成员对象的析构函数,次序和构造函数的调用次序相反
封闭类的复制构造函数
class A
{
public:
A(){cout<<"default"<<endl;}
A(A&a){cout<<"copy"<endl;}
};
class B{A a;};
int main()
{
B b1,b2(b2);
return 0;
}
- 输出
default
copy
说明b2.a是用类A的复制构造函数初始化的,而且调用复制构造函数时的实参就是b1.a