我正在将类更新为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;
答案 0 :(得分:15)
将构造函数设置为默认等效于:
MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {}
没有。事实并非如此。
该行
MyClass() = default;
更接近但不完全等同于:
MyClass() {}
在任何一种情况下,使用
MyClass obj;
会生成一个默认初始化对象,其成员默认初始化。
但是,使用
时它们之间存在差异 MyClass obj{};
是obj
将使用默认的默认构造函数进行零初始化,而它仍将使用用户提供的默认构造函数进行默认初始化。
答案 1 :(得分:3)
要使所有变量在构造时零初始化,即使创建者没有请求它,一种方法是:
struct MyClassMembers
{
int var;
float* ptr;
double array[3];
MyStruct data;
unique_ptr<MyStruct> smart_ptr;
};
struct MyClass : MyClassMembers
{
MyClass(): MyClassMembers{} {}
};
然后MyClass m;
将使用MyClassMembers{}
初始化成员。