【发布时间】:2020-02-25 10:44:39
【问题描述】:
默认构造函数不应将任何数据成员清零。但在某些情况下,似乎不是这样的。
代码示例很简短。
#include <iostream>
using namespace std;
class Foo {
public:
int val;
Foo() = default;
};
int main() {
Foo bar;
if (bar.val != 0) {
cout << "true" << endl;
} else {
cout << "false" << endl;
}
return 0;
}
除此之外,上述程序输出:
true
但是,如果添加了 bar 数据成员的打印语句,var 成员将被初始化为零:
...
int main() {
Foo bar;
cout << bar.val << endl;
...
}
输出将是:
0
false
同样,如果在类Foo中添加虚函数和析构函数:
#include <iostream>
using namespace std;
class Foo {
public:
virtual void Print() {}
~Foo() {}
int val;
Foo() = default;
};
int main() {
Foo bar;
if (bar.val != 0) {
cout << "true" << endl;
} else {
cout << "false" << endl;
}
return 0;
}
或者只是初始化 bar 对象:
class Foo {
public:
int val;
Foo() = default;
};
int main() {
Foo bar = Foo();
...
}
输出:
false
那么影响类的数据成员值的原因是什么?不应该所有这些测试都使用true 输出吗?
【问题讨论】:
-
static storage duration 上的部分解释了一些您可以指望零的情况。
-
请注意,读取未初始化的变量是未定义的行为,会导致整个程序没有明确定义的含义。当包含 UB 时,允许编译器对程序的 any 部分执行 anything。你再也无法推理了。
-
这种情况可能没有原因...
标签: c++ c++11 initialization