为什么第一个代码块产生垃圾值,而第二个代码块将类成员的值相加?
Why the first block of code results in garbage value, while the second block adds up the values of class members?
我有一个名为Person的类,它有一个名称,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
这是我预期的,第一个块的行为是出乎意料的,我不知道为什么会发生这种情况。
在第一种情况下,使用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
的值。
在第二种情况下,使用聚合初始化。为除最后一个成员之外的所有成员提供值时,将使用默认初始值设定项再次初始化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 将保留该值,直到您再次写入它。
相关文章:
- 删除C++继承中虚拟类成员的代码重复
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- 为什么第一个代码块产生垃圾值,而第二个代码块将类成员的值相加?
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 避免易失性和非易失性成员函数的代码重复
- 错误:类没有名为"ThisW"的成员;你是说"这个"吗?但是代码没有说"ThisW",它已经说了"This"
- 重构类:无法将派生类中成员函数的公共代码移回基类
- 如何避免大多数成员功能相同的代码重复
- 我写了一个类,它总是将其函数参数委托给它的成员,我该如何改进代码
- 从C++代码中直接读取成员属性
- 如何避免将 const 和非 const 成员函数输入到模板中的代码重复
- s.compare 成员函数在下面的C++代码中的行为如何?
- 如何基于构造函数参数模板化类成员函数的代码
- 如何在析构函数中执行一些代码*在*成员被销毁之后
- 如何使用 gcc 内联汇编器代码访问成员变量
- 带有布尔数组成员的 C++ 结构.如何在主代码中使用
- 如何打包结构的成员以实现高效的跨平台代码
- 设备代码中的CUDA类静态成员的成语
- 在通用模板代码中初始化聚合成员
- C函数调用C 成员函数 - 其中C代码与C编译器编译