有没有办法强制将默认的初始化构造函数用于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类中有很多变量都有详细的名称,我宁愿消除类不能初始化为零的不确定性,这取决于我是否默认初始化。无需手动设置所有内容。
答案 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标准开始:
为每个结构添加一个默认构造函数,这可能有点乏味。
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()
为结构的每个成员添加一个默认初始化,这就是我要做的。
//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;
如上所述,我个人认为第二个选项最适合代码可读性,错过会员的可能性非常低。