一、构造函数初始化列表
推荐在构造函数初始化列表中进行初始化
构造函数的执行分为两个阶段
初始化段
普通计算段
(一)、对象成员及其初始化
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <iostream>
using namespace std; class Object { public: Object( int num) : num_(num) { cout << "Object " << num_ << " ..." << endl; } ~Object() { cout << "~Object " << num_ << " ..." << endl; } private: int num_; }; class Container { public: Container( int obj1 = 0, int obj2 = 0) : obj2_(obj2), obj1_(obj1) { cout << "Container ..." << endl; } ~Container() { cout << "~Container ..." << endl; } private: Object obj1_; Object obj2_; }; int main( void) { Container c( 10, 20); return 0; } |
从输出可以看出几点,一是构造对象之前,必须先构造对象的成员;二是对象成员构造的顺序与定义时的顺序有关,跟初始化列表顺序无关;三是构造的顺序和析构的顺序相反;四是如果对象成员对应的类没有默认构造函数,那对象成员也只能在初始化列表进行初始化。再提一点,如果类是继承而来,基类没有默认构造函数的时候,基类的构造函数要在派生类构造函数初始化列表中调用。
(二)、const成员、引用成员的初始化
C++ Code