为什么第一个代码块产生垃圾值,而第二个代码块将类成员的值相加?

Why the first block of code results in garbage value, while the second block adds up the values of class members?

本文关键字:代码 成员 第二个 第一个 为什么      更新时间:2023-10-16

我有一个名为Person的类,它有一个名称,4变量a,b,c,d和一个值t,它添加了abcd

以下是描述我的问题的代码:

#include <iostream>
using namespace std;
class person {
public:
string name;
int a;
int b;
int c;
int d;
int t = a + b + c + d;
};
int main() {
{
person p;
cin >> p.name >> p.a >> p.b >> p.c >> p.d;
cout << p.t << 'n'; // garbage
}
{
person p;
string s;
int A, B, C, D;
cin >> s >> A >> B >> C >> D;
p = {s, A, B, C, D};
cout << p.t << 'n'; // prints the sum
}
return 0;
}

在第一个块中,假设我收到用户的"Andy",1,2,3,4,打印t时,它打印了一个垃圾值。在第二个块中,它打印t=10这是我预期的,第一个块的行为是出乎意料的,我不知道为什么会发生这种情况。

在第一种情况下,使用t的默认初始值设定项。虽然当t通过a + b + c + d初始化时,成员abcd还没有被初始化。仅在创建对象分配值:

// create object with members not initialized
person p;   
// write values
cin >> p.name >> p.a >> p.b >> p.c >> p.d;
// garbage
cout << p.t << 'n'; // garbage

中间线与你看到的t无关,因为t只在构造函数运行之前初始化一次。稍后设置其他成员不会影响t的值。

在第二种情况下,使用聚合初始化。为除最后一个成员之外的所有成员提供值时,将使用默认初始值设定项再次初始化t。在这种情况下,在初始化t时,所有其他成员都已初始化(成员按照它们在类定义中出现的顺序进行初始化(。因此,您会看到正确的值。

使用=运算符不会创建代码将始终保持 true 的"规则"。例如:

int i = 9;  //i = 9
int j = i + 1;  // right now, j == 10
i = 99;     //now, i is equal to 99, but j has not changed.
// j doesn't retroactively become 100 because of a previous line of code.

因此,在默认构造函数中,t 被初始化为垃圾,并且它将保持为随机垃圾值,直到再次写入。t = a + b + c + d;不是数学公式。它执行一次,t 将保留该值,直到您再次写入它。