基本概念
又称有对象的类叫 封闭(enclosing)类
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){}main() {CCar car(2000, 2, 3);}
下面语句会出错: CCar car;
- 因为编译器不明白car.tyre该如何初始化,但car.engine没问题
- 任何封闭类对象的语句,都要让编译器明白,对象中的成员对象,是如何初始化的
- 限制性所有对象成员的构造函数,然后执行自己的
- 万一封闭类对象初始化的时候要调用成员对象的玩意呢?
- 对象成员的构造函数调用次序和对象成员在类中的说明次序一致,与它们在成员初始化列表中的出现次序无关
- 封闭类的对象消亡时,先执行封闭类的析构函数,然后再执行成员对象的析构函数。次序和构造函数的调用次序相反。
封闭类的复制构造函数
class A {public:A() { cout << "default" << endl;}A(A & a) {cout << "copy" << endl;}};class B {A a;};main() {B b1, b2(b1);}// 输出 default copy
