c++中返回引用与返回值的区别

Difference between returning reference vs returning value C++

本文关键字:返回值 区别 引用 返回 c++      更新时间:2023-10-16

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

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

是真的在我的示例代码中,返回引用vs值无关紧要吗?在什么样的例子中它会开始起作用呢?

在我看来,我们不能返回函数局部变量的引用,因为局部变量将超出调用者的作用域。因此,只有返回调用者可以看到(在作用域中)的变量的引用才有意义,但是如果函数的调用者可以看到该变量,那么它就不需要返回(?)(或者为了保持代码整洁而返回?)

相关链接:返回引用是一个好主意吗?

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

不同的是,当你返回一个引用时,你可以赋值给GetVal()的结果:

myObj.GetVal() = 42;

您也可以保留返回的引用,并在以后使用它来修改myObj.val

如果GetVal()按值返回val,这些都是不可能的。

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

请注意,您的示例与链接问题中的代码非常不同——该代码返回无效引用,显然是一个坏主意。

在这种情况下,不同之处在于,按引用返回允许调用方通过给数据成员赋值来修改它,而按值返回只向调用方返回变量的副本。

第一个允许你写:

myObj.GetVal() = 100;

而后者没有。

注意,第一个方法在某种程度上允许函数的调用者获得对private数据成员的引用,并且可以随意修改它。对我来说,这是我想避免的事情。我不希望类的用户随意更改类成员的状态。

除非返回这样的引用代码,否则将是非法的

int main()
{
    myClass myObj(666);
    myObj.GetVal() = 777;
    return 0;
}
所以一个重要的问题是你是否希望这样的代码是合法的。在这种情况下,我会说没有,但其他情况可能会有所不同。

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

对于复杂对象,还存在一个问题,即您是希望复制对象还是返回对原始的引用。但是,对于像int这样的简单类型,这不太可能是一个问题。