我可以说服自动生成的构造函数将POD类成员归零吗?

时间:2018-08-17 13:22:01

标签: c++

比方说,我定义了一个包含一些简单POD成员的类,而且我懒得写出默认构造函数来将所有类成员初始化为默认值。相反,我要求编译器为我执行此操作:

class Foo
{
public:
    Foo() = default;
    int x;
    // etc.
}

我已经使用MSVC进行了测试,并且x被此自动生成的构造函数初始化为零:对于类Foo的本地对象,{{1 }}设置为0xcccccccc,这是我期望的未初始化堆栈变量的值。

我的问题是是否存在一种符合标准的方法来说服编译器自动对这些POD成员进行零初始化。我之所以说“符合标准”,是因为我需要能够依靠其他编译器来表现类似的行为。我之所以说“自动”,是因为如果可以避免的话,我不想写出列出每个类成员的构造函数。

2 个答案:

答案 0 :(得分:4)

您可以像这样使用类内成员初始化器:

class Foo {
    int x = 0;;
    int y{}; // same effect.
};

优点是可以在以后添加的构造函数之间保持一致性。 Core Guidelines C.45也推荐这种方法。

在头文件中声明此类时,可能会产生不利影响,因为必须知道并且不能向前声明以这种方式初始化的所有成员变量的类型。

答案 1 :(得分:1)

他们有两种解决方案:

  1. 按照刚才显示的lubgr的定义,定义成员的默认初始化程序。
  2. 或者总是喜欢对值进行初始化,以便可以默认初始化类:Foo an_obj{};代替Foo an_obj;