返回与不返回有什么区别?

时间:2019-05-15 14:08:37

标签: c++

我仍然没有弄清楚&在编译器中如何工作。

要弄清楚,我尝试分解下面的代码:

private:
        int data;
public:
int& at()
{
    return data;
}
int at()
{
    return data;
}

const int& result = mymay.at(); //call the two functions

我发现int& at()返回一个地址,int at()返回一个值;编译器首先将值写入内存,然后将“结果”的地址设置为该地址。 因此,我知道int at()将返回一个副本。 我也了解写friend ostream& operator<<(ostream &os , const A &obj)

是最佳实践

但是我不知道这是否正确:在下面的代码中,A &get1()返回一个l-value,而A get2()返回一个r-value

#include <iostream>
using namespace std;
class A
{
public:
    A &get1(){
        return *this;
    }
    A get2(){
        return *this;
    }
    friend ostream& operator<<(ostream &os , A &obj){
        cout<<"An l-value function called."<<endl;
        return os;
    }
    friend ostream& operator<<(ostream &os , A &&obj){
        cout<<"An r-value function called."<<endl;
        return os;
    }
};
int main()
{
    A tmp;
    cout<<"get1: "<<tmp.get1()<<"get2: "<<tmp.get2()<<endl;
    return 0;
}

实际结果:

An l-value function called.
An r-value function called.

1 个答案:

答案 0 :(得分:6)

返回引用的at版本允许您通过该引用修改成员数据data

mymay.at() = 1;

data的实例中将mymay设置为1。因此mymay.at() l值:即可以放在左手作业的另一面。

返回值的at版本不允许您这样做。这不是 l值


第二点, l值不能绑定到 rvalue引用 &&,而匿名临时可以。 cout的重载分辨率是明确的,它说明了程序的输出。