虽然简单,再复习复习,哈~
成员初始化列表与其他初始化的不同
// 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 引用变量的初始化