initialization list

王朝other·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

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

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

// 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 引用变量的初始化

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航