Edu*_*yan 1 c++ constructor initialization class
所有旧的和现代的C++书籍和专家都声明按照声明顺序初始化类成员.但是,如果我不这样做,也没有解释?我不是在谈论具有const类型或smth成员的类.只是简单的简单类.
考虑样本:
class A
{
int n;
std::vector<double> VD;
char c;
public:
A():
VD(std::vector<double>(3)),
c('a'),
n(44)
{
}
};
Run Code Online (Sandbox Code Playgroud)
什么是书面代码与具有相同顺序的代码的区别?
什么是书面代码与具有相同顺序的代码的区别?
如果成员不依赖于彼此的初始化顺序,则没有任何区别.但如果他们这样做,那么成员初始化列表可能会说谎.
当他们认为他们的构造函数被正确编写时,许多程序员被这个咬了,但实际上他们手上有不确定的行为.
考虑这个简单的情况:
struct foo {
int _a;
int _b;
foo(int b) : _b(b), _a(2 * _b) {}
};
Run Code Online (Sandbox Code Playgroud)
什么是_a在上面的例子?如果您回答"行为未定义因为_b已初始化",那么您就错了.
但是如果我不这样做,也没有解释什么?
程序员无法控制它:在初始化列表中列出成员的顺序对初始化的实际顺序没有影响.编译器忽略列表中项目的顺序,并重新排序表达式以匹配声明顺序.
这是一个简短的例子来说明这一点:
struct Foo {
Foo(const char *s) { cout << "Init " << s << endl; }
};
struct Bar {
Foo a;
Foo b;
Foo c;
Bar() : c("c"), b("b"), a("a") {
}
};
Run Code Online (Sandbox Code Playgroud)
以上打印
Init a
Init b
Init c
Run Code Online (Sandbox Code Playgroud)
即使初始化以相反的顺序列出项目.