在POD中强制默认初始化构造函数?

时间:2015-07-18 20:36:26

标签: c++

有没有办法强制将默认的初始化构造函数用于POD类型。这样所有的值如整数都被初始化为零?

struct MyPod
{
    int a; // whether a is initialized to zero is dependent on creation method
};

struct MyOtherNonPod
{
    int b;
    MyOtherNonPod() : b(0) // b initialized to zero regardless of creation method
    {}
};

MyPod* pod = new MyPod; // pod->a not initialized
MyOhterNonPod* otherPod = new MyOtherNonPod; // otherPod->b is initialized to zero

有没有办法在不必定义构造函数和手动初始化所​​有变量的情况下执行此操作?但是只需强制执行默认的初始化构造函数来始终调用?

MyPod* pod = new MyPod{}; // pod->a is default initialized to zero

有没有办法强制使用上述构造函数,无论{}是否存在?我的POD类中有很多变量都有详细的名称,我宁愿消除类不能初始化为零的不确定性,这取决于我是否默认初始化。无需手动设置所有内容。

4 个答案:

答案 0 :(得分:2)

POD的定义是没有用户定义的构造函数,并且所有成员都必须是POD。

所以,不,你不能。但看起来你不需要POD。

#include <iostream>

struct NonPOD {
    int    i = {};
    double d = {};
    // NonPOD() = default;
};

int main() {
    NonPOD x;
    std::cout << x.i << ", " << x.d << "\n";
}

答案 1 :(得分:1)

无法按照您的要求执行操作,因为POD可能没有用户声明的构造函数。另一种方法是创建一个以POD为基类的类:

struct MyPodV : MyPod
{
    MyPodV: MyPod() {}
};

然后你可以创建MyPodV对象,并且仍然使用期望MyPod的函数。

当然有一个问题是你可能忘记并制作MyPod而不是MyPodV,所以这并没有超过要求人们去做MyPod x{} 。也许您可以使用命名约定来使自己更难以意外地创建POD。

答案 2 :(得分:0)

是的,有一种方法可以在C ++ 11中实现。这是代码:

#include <iostream>

struct MyPod
{
    int a; // whether a is initialized to zero is dependent on creation method
};


int main()
{
    MyPod* pod = new MyPod{ 23 }; // pod->a initalized to 23

}

在这种情况下必须使用花括号,因为这样做是顺序地使每个成员初始化。如果您在MyPod中有更多类型,那么它可能如下所示:

#include <iostream>

struct MyPod
{
    int a; 
    bool b;
    double c;
};


int main()
{
    MyPod* pod = new MyPod{ 23, false, 32.93 }; 
}

答案 3 :(得分:0)

我担心c ++中没有默认的自动初始化,至少不会像你期望的那样。

据我所知,你有三个选择可供选择,至少从c ++ 11标准开始:

  1. 为每个结构添加一个默认构造函数,这可能有点乏味。

    SELECT r.* FROM random r
    WHERE (
      SELECT COUNT(*) FROM random r1
      WHERE r.category = r1.category AND r.id < r1.id
    ) <= 2
    ORDER BY r.category ASC, RAND()
    
  2. 为结构的每个成员添加一个默认初始化,这就是我要做的。

    //Init by default constructor
    struct POD3{
        int a;
        int b;
        char c;
        POD3(): a{}, b{}, c{} {};
    };
    POD3 stackPod3;
    POD3* heapPod3 = new POD3;        
    
  3. 或者冒险并在创建对象时依赖于正确的语法,这是最糟糕的选择。

    //Init by field
    struct POD{
        int a{};
        int b{};
        char c{};        
    };
    POD stackPod;
    POD* heapPod = new POD;
    
  4. 如上所述,我个人认为第二个选项最适合代码可读性,错过会员的可能性非常低。