成员初始化列表

类对象的构造顺序是这样的:
1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
初始化阶段可以是显式的或隐式的,取决于是否存在成员初始化表。隐式初始化阶段按照声明的顺序依次调用所有基类的缺省构造函数,然后是所有成员类对象的缺省构造函数。
2.进入构造函数后在构造函数中执行一般计算

计算阶段由构造函数体内的所有语句构成。在计算阶段中,数据成员的设置被认为是赋值,而不是初始化。

使用初始化列表有两个原因:

1.必须这样做:

三种情况下需要使用初始化成员列表:
一,对象成员;
二,const修饰的成员;
三,引用成员数据;

(1)如果有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一步,就会报错。

using   namespace  std;
class  ABC
{
public :
    ABC(
int  x, int  y, int  z):a(x),b(y),c(z){};
private :
  
int  a;
    
int  b;
    
int  c;
};
class  MyClass
{
public :
    MyClass(
int  a, int  b, int  c):abc(a,b,c){}
private :
    ABC abc;
};

int  main()
{
    MyClass o(
1 , 2 , 3 );
    
return   0 ;
}


(2)当类成员中含有一个const成员时

(3)当类成员中含有一个引用时

#include < iostream >
using   namespace  std;

class  ConstRef {
public :
    ConstRef(
int  i);
    
void  print();
private :
    
int  a;
    
const   int  b; //const成员
     int   & c; //引用
};

ConstRef::ConstRef(
int  i):b(i),c(a) // 含有一个const对象时,或者是一个引用时使用初始化成员列表
{
    a 
=  i;        //  ok
    
// b = i;          //  错误
    
// c = a;        //  错误
}
void  ConstRef::print()
{
    cout
<< a << endl;
    cout
<< b << endl;
    cout
<< c << endl;
}
int  main()
{
    ConstRef o(
1 );
    o.print();
    
return   0 ;
}

结果:

1

1

1

2.效率要求这样做:

类对象的构造顺序显示,进入构造函数体后,进行的是计算,是对他们的赋值操作,显然,赋值和初始化是不同的,这样就体现出了效率差异,如果不用成员初始化 列表,那么类对自己的类成员分别进行的是一次隐式的默认构造函数的调用,和一次复制操作符的调用,如果是类对象,这样做效率就得不到保障。

注意:构造函数需要初始化的数据成员,不论是否显式的出现在构造函数的成员初始化列表中,都会在该处完成初始化,并且初始化的顺序和其在声明时的顺序是一致的,与列表的先后顺序无关,所以要特别注意,保证两者顺序一致才能真正保证其效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值