知识点:
在C++中,成员变量的初始化顺序只与它们在类中声明的顺序有关,而与初始化列表中的顺序无关。
不知道大家知不知道这个,反正我是不知道(或者忘了),我是在《剑指offer》上看到的,后来在《Effective C++》中条款4中再次看到,特地在这记录一下,防止忘记。
下面举个具体的例子,摘自《剑指offer》:
class A
{
private:
int n1;
int n2;
public:
A() : n2(0), n1(n2 + 2)
{
}
void Print()
{
std::cout << "n1: " << n1 << ", n2: " << n2 << std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.Print();
return 0;
}
如果你不懂上面的知识点,肯定一开始和我的答案是一样的,n1为2,n2为0。如果运用上面的知识点,正确答案是:n1是随机值,n2是0。所以大家一定要注意了。
为什么C++要这么做呢,我查了下资料,引自这篇文章(
http://www.cnblogs.com/lidabo/p/3790606.html,感谢作者)的一句话:
因为成员变量的初始化次序是根据变量在内存中次序有关,而内存中的排列顺序早在编译期就根据变量的定义次序决定了。