当"int&i"是类的属性时发生了什么

what happened while `int &i` is a property of class

本文关键字:属性 什么 发生了 int      更新时间:2023-10-16

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;
}

作为引用的类成员变量只能被构造,而不能被赋值。此代码根据构造函数参数int b构造变量int &i2

参数很像局部变量,它们在调用后就不再存在了。

因此,i2现在指的是一个已经不存在的整数。这是未定义的。

这就是为什么你会得到奇怪的输出。

顺便说一句,如果你好奇的话,引用通常被实现为指针,并隐藏地使用运算符的地址。因此,引用内部的指针现在可能指向堆栈上参数int b的位置,但正如我上面所说,它已经不在了,因此如果访问引用,将导致未定义的行为。你可以在网上搜索"返回对局部变量的引用"来了解更多信息。

这是未定义的行为,因为i2引用的是一个局部变量(b),该变量在构造函数完成后被销毁。