繁体   English   中英

初始化新对象时的C ++默认构造函数和POD问题

[英]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结构的兼容性(因为最终,这就是它的全部内容)。

特别是,最重要的属性(至少在我看来)是:

  • 标准布局 :这很重要,因为在外行人看来,当类是标准布局时,对象可以被视为一个字节序列,发送到其他程序(可能用不同语言编写)并在接收时从这个序列重建结束(在考虑填充之后)。 当实体序列化数据通过网络发送或保存到文件时,这将发挥重要作用
  • 平凡的可复制 :这很重要,因为当类很容易复制时,只需从一个对象的内存复制字节就可以从另一个对象创建一个对象。 这在优化中起了很大作用
  • 平凡类型 ,从上面开始的Trivially Copyable要求的扩展:它很重要,因为当类是普通类型时,任何随机的字节序列都可以被视为该类型的有效对象(在考虑内存别名之后)。
 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM