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

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

我有一个名为 Person 的 class,它有一个名字,4 个变量 a、b、c、d 和一个值 t,它添加了 ab, c, d 起。

这是描述我的问题的代码:

#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,这是我预期的,第一个块的行为是意外的,我不知道为什么会这样。

使用 = 运算符不会创建您的代码将始终保持正确的 "rule"。例如:

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 将保留该值直到您再次写入它。

在第一种情况下,使用了 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 的值没有影响。

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