Rod*_*ddy 15 c++ constructor initialization
来自C背景,我一直认为POD类型(例如整数)从未在C++中自动进行零初始化,但似乎这是完全错误的!
我的理解是,只有'裸'非静态POD值不会被填零,如代码片段所示.我做对了,还有其他重要的案例我错过了吗?
static int a;
struct Foo { int a;};
void test()
{
int b;
Foo f;
int *c = new(int);
std::vector<int> d(1);
// At this point...
// a is zero
// f.a is zero
// *c is zero
// d[0] is zero
// ... BUT ... b is undefined
}
Run Code Online (Sandbox Code Playgroud)
Jam*_*lis 17
假设您a在调用之前未进行过修改test(),a则其值为零,因为具有静态存储持续时间的对象在程序启动时为零初始化.
d[0]值为零,因为调用的构造函数std::vector<int> d(1)具有第二个参数,该参数采用默认参数; 第二个参数被复制到正在构造的向量的所有元素中.默认参数是T(),所以你的代码相当于:
std::vector<int> d(1, int());
Run Code Online (Sandbox Code Playgroud)
你是正确的,b具有不确定的价值.
f.a并且*c都具有不确定的值也是如此.要初始化它们(对于POD类型与零初始化相同),您可以使用:
Foo f = Foo(); // You could also use Foo f((Foo()))
int* c = new int(); // Note the parentheses
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4876 次 |
| 最近记录: |