(1)构造函数初始化列表:
1 class Test{ 2 int i; 3 public: 4 Test(int vi):i(vi){}//这里的从冒号开始,到右大括号结束,这一段是构造函数初始化列表 5 6 };
构造函数的执行分为两个阶段:(1)初始化阶段 (2)普通计算阶段
初始化是我们定义一个变量,分配内存时直接给变量赋值,例如 int i=10; 而int k; k=10;这样的就不是初始化,是赋值。所以在初始化列表里面的初始化才是真正的初始化,即初始化阶段。而在构造函数内的那些是赋值操作,即普通计算阶段。
(1)const 成员变量的初始化,只能在构造函数初始化列表初始化,其实在其定义处也可以直接初始化
1 class Object{ 2 const int i;//const成员变量 3 public: 4 Object(int vi):i(vi){}//在初始化列表中对const成员变量初始化 5 6 };
(2)引用成员变量的初始化,也只能在构造函数初始化列表中进行
1 class Object{ 2 int N; 3 int& refN;//引用成员变量 4 public: 5 Object():refN(N){}//在构造函数初始化列表处对引用成员变量初始化 6 7 8 };
(3)对象成员的初始化,如果子对象没有默认构造函数,也只能放在外部类的构造函数初始化列表初始化。
1 class Object{ 2 int m_i; 3 public: 4 Object(int vi):m_i(vi){} 5 6 }; 7 8 class Container{ 9 Object obj; 10 public: 11 Container(){} 12 }; 13 14 15 int main(){ 16 17 Container cn;//这句话会报错误,因为在创建Container对象时,会先创建Object的对象,此时会调用Object的默认构造函数 ,但是我们在Object类里面并没有定义默认构造函数。 18 return 0; 19 }
所以上面的问题有两个解决版本,一是在Object类中添加默认构造函数,二是在Container构造函数初始化列表中,像obj(0)这样初始化obj对象。
如果一个类中包含对象成员,那么再构造时,先构造对象成员,然后再构造外部对象。 并且一个类中包含多个对象成员,这些对象成员的构造顺序是和定义顺序一致的。在析构对象成员时,和定义的顺序相反。
还有就是先析构外部对象,再析构内部子对象。
(4)如果要定义一个对所有对象都是常量的成员,可以采用两种形式 一,是const static int 二,是enum枚举
1 class Object{ 2 const static int N=10; 3 enum E_Type{ 4 TYPE_A=100; 5 }; 6 int a[N]; 7 int b[TYPE_A]; 8 public: 9 10 11 };
时间: 2024-10-05 05:41:44