基本概念

  • 又称有对象的类叫 封闭(enclosing)类

    1. class CTyre {
    2. private:
    3. int radius;
    4. int width;
    5. public:
    6. CTyre(int r, int w):radius(r), width(w){}
    7. }
    8. class CEngine{};
    9. class CCar {
    10. private:
    11. int price;
    12. CTyre tyre; // 成员对象
    13. CEngine engine; // 成员对象
    14. public:
    15. CCar(int p, int tr, int tw);
    16. };
    17. CCar::CCar(int p, int tr, int w):price(p), tyre(tr,w){}
    18. main() {
    19. CCar car(2000, 2, 3);
    20. }
  • 下面语句会出错: CCar car;

    • 因为编译器不明白car.tyre该如何初始化,但car.engine没问题
  • 任何封闭类对象的语句,都要让编译器明白,对象中的成员对象,是如何初始化的
    • 具体做法:通过封闭类的构造函数的初始化列表

      封闭类构造函数和析构函数的执行顺序

  1. 限制性所有对象成员的构造函数,然后执行自己的
    1. 万一封闭类对象初始化的时候要调用成员对象的玩意呢?
  2. 对象成员的构造函数调用次序和对象成员在类中的说明次序一致,与它们在成员初始化列表中的出现次序无关
  3. 封闭类的对象消亡时,先执行封闭类的析构函数,然后再执行成员对象的析构函数。次序和构造函数的调用次序相反。

    封闭类的复制构造函数

    1. class A {
    2. public:
    3. A() { cout << "default" << endl;}
    4. A(A & a) {cout << "copy" << endl;}
    5. };
    6. class B {A a;};
    7. main() {
    8. B b1, b2(b1);
    9. }
    10. // 输出 default copy