[英]C++ default constructor and POD questions when initializing a new object
我理解差异(至少我相信我理解)默认构造函数和用户提供的空构造函数之间的区别以及POD的含义。 但是,在对象初始化期间有一些我不太了解的行为:
#include <iostream>
using namespace std;
//POD
struct A {
int a, b, c;
};
//Not POD
struct B {
B() {};
int a, b, c;
};
int main(){
A a = {1,2,3} \\ Case 1. Works, this is how we initialize a POD type
B b1 = {1,2,3} \\ Case 2. Doesn't work, since B is not POD
B b2; \\ Case 3. Works, call the user provided empty constructor but a, b and c are not initialized
A c{}; \\ Case 4. Works, initialize everything to 0
A d; \\ Case 5. Doesn't work. This is the case I don't understand
cout << a.a << a.b << a.c << endl;
cout << b1.a << b1.b << b1.c << endl;
cout << b2.a << b2.b << b2.c << endl;
cout << c.a << c.b << c.c << endl;
cout << d.a << d.b << d.c << endl;
}
如上所述,案例5是我不理解的行为。 我期待它将调用默认构造函数并将每个成员初始化为0.但是,我得到编译错误:
错误C4700未初始化的局部变量'd'使用
任何人都可以帮助我理解为什么它报告上述错误? 我在Windows上运行并使用Visual Studio编译器。
回答问题的另一个方面,即“ PODness ”。
POD是一种传统的定义,它不再被使用,因为它不可能涵盖各种情况。 它在C ++ 20中已弃用 。 相反,使用各种术语来讨论类与C结构的兼容性(因为最终,这就是它的全部内容)。
特别是,最重要的属性(至少在我看来)是:
Error C4700 uninitialized local variable 'd' used
任何人都可以帮助我理解为什么它报告上述错误?
该错误意味着您(可能?)读取了一个不确定的值。 读取不确定值的行为是不确定的(忽略某些明显不适用于您的情况的例外情况)。
似乎编译器确定在初始化之前使用(成员) d
的值,并且它试图通过诊断问题来帮助。
从技术上讲,读取不确定的值并不会使程序格式错误,因此不允许阻止编译。 您可能已经将编译器配置为故意违反标准,在警告的情况下拒绝编译。 如果还没有,那么这可能是编译器中的一致性错误。
解决方案:不要读取不确定的值。 您可以将初始化值初始化为零,或列出其他值的初始化。 例如,参见案例1和4。
关于命名的小修正:
案例3.工作,调用用户提供的空构造函数,但a,b和c初始化为随机垃圾值
更准确:成员未初始化,可能还剩1个不确定值。
1在您的示例中,您使用静态存储声明变量。 这些在动态初始化之前最初是零初始化的。 因此,在您的示例中,成员没有不确定的值,而是零。
案例4.通过调用默认构造函数,将所有内容初始化为0
int
s没有“默认构造函数”。 它们是初始值。 int
值初始化是零初始化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.