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

时间:2013-12-02 13:27:54

标签: c++

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

2 个答案:

答案 0 :(得分:2)

作为引用的类成员变量只能构造,而不能分配。 此代码从构造函数参数int &i2构造变量int b

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

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

这就是你得到奇怪输出的原因。

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

答案 1 :(得分:1)

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