构造函数constructor 与析构函数destructor(三)

(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 };
原文地址:https://www.cnblogs.com/cplinux/p/5616612.html