为什么操作符的地址在可以设置为普通变量时需要从函数返回地址?

时间:2014-06-04 00:37:49

标签: c++

所以这是我的小班:

class test{
public:
    int& addressofx();
private:
    int x;
};

int& test::addressofx(){
    return x;
}

这是主要的:

int main(){
    test a;
    int& foo = a.addressofx();
}

为什么上面编译正常,但是当我将函数addressofx变成常规int函数(而不是int&)时,我会得到错误?

你可以这样做:

int x;
int &y = x;

没有获取x的地址,但是当你从函数返回x时你需要它的地址吗?为什么呢?

2 个答案:

答案 0 :(得分:1)

你没有回复任何地址。您正在返回reference

此代码将返回一个地址:

class test {
    public:
        int* addressofx();
    private:
        int x;
};

int* test::addressofx() {
    return &x;
}

int main() {
    test a;
    int* foo = a.addressofx();
}

答案 1 :(得分:0)

  

INT&安培; addressofx();

这会将引用返回给int变量。

  

INT&安培; foo = a.addressofx();

这是声明非const 左值引用(左值表示它已为其分配变量名称,即它可以显示在左侧表达式),包含对int变量的引用。由于函数返回对int的引用,编译器很高兴。

  

当我将函数addressofx变成常规int函数(而不是int&)时,我得到错误?

const 左值引用无法绑定到临时值(如果进行更改,addressofx()将返回该值。这就是 rvalue 引用(在C ++ 11中引入)被设计用来处理,但是你没有在这个例子中使用该功能。

  

你可以这样做:
  int x;
  int& y = x;

因为您声明左值引用并将其绑定到左值变量。这是允许的。

如果您更改addressofx()以返回int右值,因为它没有名称,因此它只能出现在表达式的右侧) ,返回值不能绑定到非const 左值引用,因为它不是真正的变量。但是,可以绑定到const 左值引用(然后编译器会将临时的生命周期延长到函数的返回值之外),例如:< / p>

int addressofx();
...
const int& foo = a.addressofx();

简而言之,您需要了解参考的工作原理,以及左值右值之间的区别。并非所有组合都可以一起使用。