为什么第一段代码产生垃圾值,而第二段代码将 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
,它添加了 a
,b
, 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
初始化时,成员a
、b
、c
和d
还没有被初始化。您仅在 创建对象后 赋值:
// 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 定义中出现的顺序进行初始化)。因此您会看到正确的值。
我有一个名为 Person 的 class,它有一个名字,4
个变量 a、b、c、d 和一个值 t
,它添加了 a
,b
, 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
初始化时,成员a
、b
、c
和d
还没有被初始化。您仅在 创建对象后 赋值:
// 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 定义中出现的顺序进行初始化)。因此您会看到正确的值。