hel*_*hod 12 c++ initialization-list
在Effective C++中,据说初始化列表中的数据元素需要按其声明的顺序列出.进一步说,对此的推理是数据元素的析构函数以其构造函数的相反顺序被调用.
但我只是看不出这可能是个问题......
sha*_*oth 25
好好考虑以下几点:
class Class {
Class( int var ) : var1( var ), var2(var1 ) {} // allright
//Class( int var ) : var2( var ), var1(var2 ) {} // var1 will be left uninitialized
int var1;
int var2;
};
Run Code Online (Sandbox Code Playgroud)
第二个(注释掉的)构造函数看起来很好,但实际上只会var2初始化 - var1将首先进行初始化,var2然后使用尚未初始化的那个进行初始化.
如果按照与成员变量相同的顺序列出初始化程序,则在类声明中列出此类错误的风险会降低很多.
Cyg*_*sX1 10
当成员也是某种类的对象时,构造和破坏的顺序可能是重要的,这些对象以某种方式相互依赖.
考虑一个简单的例子:
class MyString {
public:
size_t s_length;
std::string s;
MyString(const char *str) : s(str), s_length(s.length()) {}
};
Run Code Online (Sandbox Code Playgroud)
此示例中的意图是成员s_length保存存储字符串的长度.但这不起作用,因为之前s_length会进行初始化.所以你在执行构造函数之前调用! ss.lengths
例如,如果您有这样的类:
class X {
int a,b;
X(int i) : b(i),a(b) { } // Constructor
};
Run Code Online (Sandbox Code Playgroud)
类X的构造函数看起来首先初始化"b",但它实际上是按声明的顺序初始化.这意味着它将首先初始化"a".然而,"a"初始化为尚未初始化的"b"值,因此"a"将获得垃圾值.