【发布时间】:2019-06-23 20:39:10
【问题描述】:
在 C++11 及更高版本中,似乎是因为 default 和 value 初始化之间的差异取决于我如何定义我的类,初始化的结果可能会有所不同。例如,看看下面的类或http://coliru.stacked-crooked.com/a/b45acc5acf847e73:
#include <iostream>
#include <string>
#include <vector>
class ClassWithDefaultedConstructor {
public:
ClassWithDefaultedConstructor() = default;
int GetInt() const { return member_int_; }
bool GetBool() const { return member_bool_; }
std::string GetString() const { return member_string_; }
private:
int member_int_;
bool member_bool_;
std::string member_string_;
int member_int_array_[5];
};
class ClassWithUserProvidedDefaultConstructor {
public:
ClassWithUserProvidedDefaultConstructor() : member_int_() {}
int GetInt() const { return member_int_; }
bool GetBool() const { return member_bool_; }
std::string GetString() const { return member_string_; }
private:
int member_int_;
bool member_bool_;
std::string member_string_;
int member_int_array_[5];
};
class ClassWithDefaultedConstructorAndDefaultMemberInitializers {
public:
ClassWithDefaultedConstructorAndDefaultMemberInitializers() = default;
int GetInt() const { return member_int_; }
bool GetBool() const { return member_bool_; }
std::string GetString() const { return member_string_; }
private:
int member_int_{};
bool member_bool_{};
std::string member_string_;
int member_int_array_[5]{};
};
int main()
{
std::cout << "Hello World!" << std::endl;
// Default initialization: int and bool members will have indeterminate values
ClassWithDefaultedConstructor default_init1;
// Value initialization: int and bool members will be zero-initialized
ClassWithDefaultedConstructor value_init1{};
// Default initialization: member_int_ is value initialized to 0 in constructor
// member initiazer list but member_bool_ and member_int_array_ have indeterminate values
ClassWithUserProvidedDefaultConstructor default_init2;
// Value initialization: member_bool_ and member_int_array_ are default initialized
// and have indeterminate values
ClassWithUserProvidedDefaultConstructor value_init2{};
// Default initialization: int and bool members are value initialized to 0 because
// of the default member initializers value initializing them
ClassWithDefaultedConstructorAndDefaultMemberInitializers default_init3;
// Value initialization: same as if no default member initializers were used
ClassWithDefaultedConstructorAndDefaultMemberInitializers value_init3{};
}
因此,根据我的类的客户端选择声明对象的方式(有或没有初始化程序),我的对象的起始状态会有所不同。这是真的?我在开源项目中遇到很多代码,其中标准库中的类类型成员(例如std::string)没有在用户提供的默认构造函数中初始化。如果是这样,我似乎应该为所有成员提供默认成员初始化程序,或者定义一个初始化所有成员的默认构造函数。默认构造函数和为所有成员使用默认成员初始化器与定义默认构造器初始化成员初始化器列表中的所有成员之间有什么区别吗?
【问题讨论】: