成员对象和封闭类
有成员对象的类叫封闭类
exp.
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;//tyre和engine是CTyre和CEngine的对象,tyre和engine就是成员对象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; }
任何对象初始化时都会引发构造函数的调用
att.如果CCar类不定义构造函数则CCar car
会出错
因为编译器不明白car.tyre该如何初始化,car.enginr的初始化没有问题,用默认构造函数即可
任何生成封闭类对象的额语句,都要让编译器明白,对象中的成员对象,是如何初始化的。
具体做法就是通过封闭类的构造函数的初始化列表
封闭类构造函数和析构函数的执行顺序
①封闭类对象生成时,先执行所有对象成员的构造函数,然后再执行封闭类的构造函数
②初始化列表里可能没有出现成员函数,所以对象成员的构造函数调用次序和对象成员在类中的说明次序一致
③当封闭类对象消亡时,先执行封闭类的析构函数,再执行成员变量的析构函数
封闭类的复制构造函数
exp.
class A { public: A(){cout<<"default"<<endl;} A(A&a){cout<<"copy"<<endl;} }; class B{A a;}; int main() { B b1,b2(b1); return 0; }
输出:
default Copy 说明b2.a是用类A的复制构造函数初始化的。而且调用复制构造函数时的实参就是b1.a
来源:https://www.cnblogs.com/AirBirdDD/p/12275946.html