繁体   English   中英

返回引用与返回值 C++ 之间的区别

[英]Difference between returning reference vs returning value C++

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

下面的代码的行为完全一样,如果我们更换int&int在line9和line16。

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

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

相关链接: 返回参考是个好主意吗?

#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这样的简单类型,这不太可能成为问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM