c++ - 默认初始化与值初始化

标签 c++ initialization

从这里answer , 在 C++03 中,如果 () 被省略,POD 类型将被默认初始化,否则它是值初始化的。

// POD type
struct foo {
     int x;
};

// value-initialized
new foo();

但是如果提供了用户定义的构造函数,下面的任何对象是否将被视为默认对象或值初始化对象?

// non-POD type
struct bar {
     bar(int x = 0):x(x) {}
     int x;
};

new bar();
new bar(42);

最佳答案

In C++03, a POD type gets default initialized if () is omitted otherwise it is value-initialized.

事实并非如此。根据 C++03 规范第 8.5/9 节,如果没有为非静态 POD 类型对象指定初始值设定项,则它及其子对象“具有不确定的初始值”。这与默认初始化是一回事。默认初始化与 POD 类型的值初始化相同,这意味着对象是零初始化的 (8.5/5),但这只能在存在空初始化器(即空括号)的情况下发生每 8.5/7)。因此,您只能使用空初始化程序默认和/或值初始化 POD 类型。如果未指定初始化程序,则不会发生非静态 POD 类型的默认初始化。

在您的第二个示例中,对于具有用户定义的构造函数的非 POD 类型,如果您省略值初始化器(括号)符号,则从技术上讲默认初始化将发生。换句话说:

bar* ptr_a = new bar; //default initialization
bar* ptr_b = new bar(); //value initialization

请记住,对于非 POD 结构或类类型,如果有用户定义的构造函数、默认初始化和值初始化,根据 8.5/5,两者都会调用用户定义的构造函数。所以最后,对于您声明的 bar 类型,默认和值初始化最终会做同样的事情。

关于c++ - 默认初始化与值初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8203615/

相关文章:

c++ - 将 C++ 函数指针转换为 c 函数指针

c++ - 具有更多模板参数的模板友元类

python - Python 的 "__init__.py"是否有 C/C++ 等价物?

c++ - OpenGL 示例中 WinMain 错误的重新定义

c++ - 从参数初始化数据成员的 C++11 方法

C++:为什么我们可以在 switch 的情况下声明变量

C++静态变量和多进程

c# - 静态变量的初始化顺序不明确

c++ - 如何初始化包含opencv :matrices?的二维 vector

c++ - MQL4 到 Microsoft Visual Studio 2017 社区上的 C++ dll