基本概念:
成员对象:一个类的成员变量是另一个类的对象
包含成员对象的类叫封闭类(若成员对象的构造函数中有参数,封闭类初始化时中必须进行对其进行初始化)
初始化列表:
- 定义构造函数时,可添加初始化列表:
类名::构造函数(参数表):成员变量1(参数表),成员变量2(参数表)...
{
...
}
- 成员对象初始化列表中的参数可以是:表达式/函数/变量(函数和变量要先定义)
调用顺序:
当封闭类对象生成时,先执行所有成员对象的构造函数,再执行封闭类的构造函数
成员对象的构造函数调用顺序:
- 和成员对象再类中的说明顺序一致
- 与在成员初始化列表中出现的顺序无关
而析构函数调用的顺序与构造函数调用的顺序相反。
实例:
1 /* 2 三个类,封闭类为CCar 3 */ 4 5 6 class CType 7 { 8 public: 9 CType(int r, int w) :radius(r), width(w) { printf("Type\n"); }; 10 ~CType(); 11 12 private: 13 int radius, width; 14 }; 15 16 CType::~CType() 17 { 18 printf("~Type\n"); 19 } 20 21 class CEngine 22 { 23 public: 24 CEngine(); 25 ~CEngine(); 26 27 private: 28 29 }; 30 31 CEngine::CEngine() 32 { 33 printf("Engine\n"); 34 } 35 36 CEngine::~CEngine() 37 { 38 printf("~Engine\n"); 39 } 40 41 class CCar 42 { 43 public: 44 CCar(int p, int tr, int tw); 45 ~CCar(); 46 47 private: 48 int price; 49 CType type; 50 CEngine engine; 51 }; 52 53 CCar::CCar(int p, int tr, int tw):price(p), type(tr, tw) 54 { 55 printf("Car\n"); 56 } 57 58 CCar::~CCar() 59 { 60 printf("~Car\n"); 61 }
1 CCar C = { 20000, 17, 225 };//定义一个CCar的对象,初始化参数必须为3个
//输出结果 Type Engine Car ~Car ~Engine ~Type