initialization list

 

 

 

 

虽然简单,再复习复习,哈~

成员初始化列表与其他初始化的不同

 

 

 

 

// 1)

class A

{

A():m_str(0){}

string m_str;

}

// 2)

class A

{

A()

{

     m_str = 0;

}

 string m_str;

}

 

 

 

 

1) 2) 两种初始化方式有什么不一样呢?

看一下编译器层次上,他们可能的伪代码就清楚了:

 

 

 

 

// 1)

A()

{

     m_str.string::string(0);

}

// 2)

A()

{

     string _tmp;

     tmp.string::string(0);

     m_str.string::string(_tmp);

     tmp.string::~string();

}

 

 

 

 

 

 

 

 

       显然,第一种情况要比第二好多了,因为第二个加上了一个临时对象的初始化和销毁开销,而如果这两个开销比较大的时候,就会影响程序性能了J

成员初始化列表的执行顺序

光注意到好处还不行,问题还是存在的。看下面的代码:

 

 

 

 

class B{……}

class A

{

    A(const B& b):m_b(b),m_b_copy(m_b){……}

    B m_b;

    B m_b_img;

};

 

 

 

 

好象很理所当然的写法……,但是实际上存在错误?

       因为成员初始化列表的执行顺序是右优先级的,如同运算符,参数传递一样,知道是右优先级了那上面的代码当然是错的了……J (不知道是否所有的编译器都是右优先级,既然不知道,恩,就要避免这么写贝@#%^%)。

成员初始化列表与其他初始化的执行顺序

看到上面的错误,可能又会想到另外一个‘错误’。

 

 

 

 

class A

{

     A(int in):data(in)

     {

         data_img = data;

}

     int data;

     int data_img

}

 

 

 

 

 

 

 

 

 

 

 

 

上面的代码会有问题吗——究竟是 data(int) 先执行还是 data_img=data先执行呢?

答案是前者。

成员列表的初始化代码会被编译器插入到构造函数的user-code 之前。(好象所有编译器私底下增加的都在user-code 之前吧)J

何时必须使用成员初始化

1           const 数据成员

2           成员对象的带参数初始化

3           base-class 带参数初始化

4           引用变量的初始化

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值