为什么第一段代码会产生垃圾值,而第二段代码会累加类成员的值?

我有一个名为Person的类,它具有一个名称,4变量a,b,c,d和一个值t,该值加上ab,{ {1}},向上c

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

d

在第一个块中,假设我收到用户的“ Andy”,1、2、3、4,在打印#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,D}; cout << p.t << '\n'; // prints the sum } return 0; } 时,它会打印垃圾值。在第二个块中,它打印出我期望的t = t,第一个块的行为是意外的,我不知道为什么会这样。

Z584036976 回答:为什么第一段代码会产生垃圾值,而第二段代码会累加类成员的值?

在第一种情况下,将使用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初始化时,所有其他成员已经被初始化(成员按照它们在类定义中出现的顺序进行初始化)。因此,您会看到正确的值。

,

使用=运算符不会创建一个“规则”,使您的代码将始终保持真实。例如:

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

本文链接:https://www.f2er.com/2756623.html

大家都在问