基本概念
又称有对象的类叫 封闭(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