返回引用与返回值C ++之间的差异

时间:2013-04-06 06:36:09

标签: c++ reference

关于为什么有必要从函数返回引用的问题。

以下代码的行为完全相同,如果我们在第9行和第16行中将int&替换为int

在我的示例代码中是真的,返回引用与值无关紧要吗?在什么样的例子中,它将开始重要?

在我看来,我们无法返回函数局部变量的引用,因为局部变量将超出调用者的范围。因此,只返回调用者可以看到的变量的引用(在范围内),但是如果函数的调用者可以看到变量,那么它就不需要返回(?)(或者这是返回的)是为了保持代码干净整洁?)

相关链接:Is returning a reference ever a good idea?

#include <iostream>
using namespace std;

class myClass{
private:
    int val;
public:
    myClass(int);
    int& GetVal();
};

myClass::myClass(int x){
    val = x;
}

int& myClass::GetVal(){
    return val;
}

int main()
{
    myClass myObj(666);
    cout << myObj.GetVal() << endl;
    system("pause");
    return 0;
}

3 个答案:

答案 0 :(得分:6)

不同之处在于,当您返回引用时,您可以分配GetVal()的结果:

myObj.GetVal() = 42;

您还可以保留返回的参考,并稍后使用它来修改myObj.val

如果GetVal()按值返回val,则无法做到这一点。

这是否是可取的,或者确实是好的设计,完全是一个不同的问题。

请注意,您的示例与linked question中的代码非常不同 - 该代码返回无效引用,并且明确地是一个坏主意。

答案 1 :(得分:2)

在这种情况下,区别在于通过引用返回允许调用者通过为其赋值来修改数据成员,而按值返回则仅向调用者返回变量的副本。

首先允许你写:

myObj.GetVal() = 100;

虽然后者没有。

请注意,第一种方式允许函数的调用者获取对private数据成员的引用,并且可以随意修改它。对我来说,这是我想避免的事情。我不希望班级用户随意改变班级成员的状态。

答案 2 :(得分:2)

除非你返回这样的参考代码,否则将是非法的

int main()
{
    myClass myObj(666);
    myObj.GetVal() = 777;
    return 0;
}

所以一个重要的问题是你是否希望这样的代码合法。在这种情况下,我会说不,但其他情况可能会有所不同。

对于你的另一点,你几乎是对的,但这不是关于用户是否可以变量,而是关于变量的生命周期。用户可能无法看到变量(例如,它可能是私有的),但只要变量仍然存在,则返回对它的引用不是错误。

对于复杂对象,还存在是否要复制对象或将引用返回原始的问题。然而,对于像int这样的简单类型来说,这不太可能成为一个问题。