C++成员对象和封闭类

有其他类的对象作为 成员对象的类叫封闭类。

任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象,是如何初始化的。
具体做法是通过封闭类的构造函数的初始化列表。

封闭类对象生成时,先执行所有对象成员的构造函数,然后才执行封闭类的构造函数。

对象成员的构造函数调用次序和对象成员在类中的说明次序一致,与它们在成员初始化列表中的出现次序无关。

当封闭类对象消亡时,先执行封闭类的析构函数,然后再执行成员对象的析构函数。次序和构造函数的调用顺序相反。其原因是如果封闭类带的析构函数中使用到了成员对象的内容,那么先执行成员对象的析构函数,就可能会导致封闭类的析构函数在执行时发生不可预估的错误。

封闭类构造函数实例。

class CTyre {
private:
    int radius;
    int width;

public:
    CTyre(int r, int w):radius(r), width(w) {} // init list
};  

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 tw):price(p), tyre(tr, tw) {}

int main()
{
    CCar car(20000, 17, 225);

    return 0;
}

如果 CCar 类不定义构造函数,则 CCar car; 将出现编译错误
编译器不知道 car.tyre 该如何初始化
car.engine 初始化没有问题,用默认构造函数

生成封闭类对象的语句 -> 明确“对象中的成员对象”-> 如何初始化

定义封闭类的构造函数时,添加初始化列表:

类名::构造函数(参数表):成员变量1(参数表), 成员变量2(参数表), ...
{
    ...
}
调用顺序

当封闭类对象生成时,
首先:执行所有成员对象的构造函数
最后:执行封闭类的构造函数

成员对象的构造函数调用顺序

1.和成员对象在类中的说明顺序一致
2.与在成员初始化列表中出现的顺序无关

当封闭类的对象消亡时,

首先:先执行封闭类的析构函数
最后:执行成员对象的析构函数

你可能感兴趣的:(C++)