默认默认构造函数是否将变量初始化为零
Does the defaulted default constructor initialize variables to zero?
我正在将一个类更新为C++14,并试图找出在构造时将所有实例变量初始化为零的最简单方法。到目前为止,我拥有的是:
class MyClass {
public:
int var;
float* ptr;
double array[3];
MyStruct data;
unique_ptr<MyStruct> smart_ptr;
MyClass() = default;
~MyClass() = default;
}
将构造函数设置为default
是否等效于执行:
MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {}
还是需要初始化每个变量?(我在Visual Studio中尝试过这两种方法,无论哪种方法我都会得到零,但我不确定这是否是运气。)
我正在实例化没有括号的类:MyClass obj;
正在将构造函数设置为默认值,相当于执行:
MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {}
编号。事实并非如此。
线
MyClass() = default;
更类似于但不完全等同于:
MyClass() {}
在任何一种情况下,使用
MyClass obj;
生成一个默认初始化的对象,该对象的成员是默认初始化的。
然而,当使用时,它们之间的差异
MyClass obj{};
obj
将使用默认默认构造函数进行零初始化,而它仍将使用用户提供的默认构造函数进行默认初始化。
要使所有变量在构造时初始化为零,即使创建者没有请求,一种方法是:
struct MyClassMembers
{
int var;
float* ptr;
double array[3];
MyStruct data;
unique_ptr<MyStruct> smart_ptr;
};
struct MyClass : MyClassMembers
{
MyClass(): MyClassMembers{} {}
};
然后MyClass m;
将使用MyClassMembers{}
来初始化成员。
有几点值得澄清。对于成员如下的类,
class MyClass {
public:
int var;
float* ptr;
double array[3];
MyStruct data;
unique_ptr<MyStruct> smart_ptr;
...
}
用户定义的默认构造函数如下,
MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {}
将导致成员变量的值初始化。如果成员变量是类类型,则其值初始化在特定条件下发生,如该链接中所述。
在定义带或不带大括号的对象(MyClass obj{};
或MyClass obj;
)时,此默认构造函数将导致类成员的值初始化。
假设MyClass
具有以下形式之一的默认构造函数:
MyClass() {};
MyClass() = default;
(关于默认构造函数的这两种形式的更多信息,请参阅此处。)就定义和初始化MyClass
的对象而言,MyClass() {};
导致默认初始化,而MyClass() = default;
在定义带大括号的对象(MyClass obj{};
)时导致值初始化。这是因为MyClass() {};
是一个用户定义的默认构造函数,其初始化列表和正文为空,这将导致成员的默认初始化。另一方面,MyClass() = default;
导致编译器定义的默认构造函数,这将在定义带大括号的对象时正确地导致值初始化。请参阅此处,了解= default;
是如何出错的。
- 使用 std::分配器在 constexpr 中进行默认初始化
- 为什么对象默认初始化,但基元不在C++?
- 为什么std::atomic的默认构造函数不默认初始化底层存储值
- 两个成员,在Base中默认初始化,可能在Derived中非默认初始化
- 默认初始化无法正常工作
- C++11默认初始化/值初始化/直接初始化
- make_shared是否对每个成员变量执行默认初始化(零初始化)
- 是否可以默认初始化具有已删除默认构造函数的类类型
- 对象成员数组C++默认初始化
- POD成员默认初始化无括号
- 如何在不使用 new 的情况下进行默认初始化
- 有没有办法欺骗 std::make_shared 使用默认初始化
- 枚举类默认初始化
- 是默认的构造函数和默认初始化
- 为什么在C 中不允许使用括号的默认初始化
- 默认初始化的含义在C 11中发生了变化
- Main()函数中的默认初始化
- WINHTTP_CURRENT_USER_IE_PROXY_CONFIG默认初始化
- 强制本地变量默认初始化
- 默认初始化混乱