当int &i
是一个类的属性时发生了什么?构造函数做了什么?堆栈和内存?我写了一个演示来解释这个问题。我在我的电脑上运行它,并获得某个运行的结果:
45 2000572096
演示是:
#include <iostream>
class A{
public:
A(int a, int b):i1(a),i2(b){};
public:
int i1;
int &i2;
};
int main()
{
A a(45,60);
std::cout << a.i1 << " " << a.i2 << std::endl;
return 0;
}
答案 0 :(得分:2)
作为引用的类成员变量只能构造,而不能分配。
此代码从构造函数参数int &i2
构造变量int b
。
参数很像局部变量,在调用后它们不再存在。
因此,i2现在指的是一个不再存在的整数。这是未定义的。
这就是你得到奇怪输出的原因。
顺便说一下,如果您的好奇,引用通常被实现为指针并隐藏使用运算符的地址。因此,引用内部的指针现在可能指向参数int b在堆栈上的位置,但正如我上面所述,它不再存在,因此如果访问引用则会导致未定义的行为。 您可以在网上搜索“返回对本地变量的引用”以了解更多信息。
答案 1 :(得分:1)
这是未定义的行为,因为i2
引用了一个构造函数完成后销毁的局部变量(b
)。