在POD中强制默认的初始化构造函数?
有没有办法强制默认的初始化构造函数用于POD类型。这样所有的值,如整数初始化为零?在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
有没有办法做到这一点,而不必定义构造函数和手动initalize所有varaibles?但相反,只是强制默认的初始化构造函数总是被调用?
MyPod* pod = new MyPod{}; // pod->a is default initialized to zero
有没有办法迫使上述构造函数来不管{}
是否存在或不使用?我的POD类中有很多变量,名称很详细,我宁愿消除类不会被初始化为零的不确定性,这取决于我是否默认初始化。无需手动设置全部。
不可能做你要求的,因为POD可能没有用户声明的构造函数。一种选择是让具有POD作为基类的类:
struct MyPodV : MyPod
{
MyPodV: MyPod() {}
};
然后您可以创建MyPodV对象,仍然与预期MyPod
功能使用它们。
当然,有一个问题,你可能会忘记和MyPod
,而不是MyPodV
,所以这并没有真正获得太多的需要人做MyPod x{}
。也许你可以使用一个命名约定来让它更难以自己创建POD。
POD的定义是没有用户定义的构造函数可以存在,所有成员都必须是POD。因此,不,你不能。但看起来你不需要POD。
#include <iostream>
struct NonPOD {
int i = {};
double d = {};
// NonPOD() = default;
};
int main() {
NonPOD x;
std::cout << x.i << ", " << x.d << "\n";
}
根据[cppr](http://en.cppreference.com/w/cpp/language/aggregate_initialization),这不是一个聚合。 Nvm,它在C++ 14中,而不是在C++ 11中。 –
有没有办法做到这一点,而不添加'= {}'? – user3901459
该标准没有说“用户定义”,它表示“非平凡”。 'NonTrivial {NonTrivial(); }; struct Trivial {Trivial(){}};' – kfsone
是的,有一种方法可以在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 };
}
我希望它被默认初始化,尽管(零),而不必依赖于它如何初始化。我希望它初始化为零,而不必依赖于使用哪种方法进行初始化,而无需手动将每个变量设置为零。 – user3901459
恐怕在C++中没有默认的自动初始化至少不是你期待的方式。
据我确切知道你三个选项,因为C++ 11标准至少选择:
-
添加一个默认的构造函数,以每个结构,这可有点乏味。
//Init by default constructor struct POD3{ int a; int b; char c; POD3(): a{}, b{}, c{} {}; }; POD3 stackPod3; POD3* heapPod3 = new POD3;
-
为结构中的每个成员添加一个默认初始化,这就是我要做的。
//Init by field struct POD{ int a{}; int b{}; char c{}; }; POD stackPod; POD* heapPod = new POD;
-
或者冒这个风险,并创建对象时,依赖于正确的语法,这是最糟糕的选择。
//Init by object creation struct POD2{ int a; int b; char c; }; POD2 stackPod2{}; POD2* heapPod2 = new POD2{};
正如上面我个人的看法已经提到的是,第二个选项是最好的代码的可读性和缺少一个成员是相当低的机会。
拳头不是吊舱。 –
@RussellGreene既不是第二个:http://coliru.stacked-crooked.com/a/74083e9916751883 – sehe
'MyOtherPod'具有用户指定的构造函数,因此不是POD对象。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf – kfsone
另请参阅:http://ideone.com/zzgItk – kfsone
一个选项是'struct MyPodV:MyPod { MyPodV():MyPod(){}};'。 'MyPodV'不是POD,但基类是,所以可能适合您的需求。 –