c++中返回引用与返回值的区别
Difference between returning reference vs returning value C++
关于为什么必须从函数返回引用的问题
下面的代码行为完全相同,如果我们将第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
这样的简单类型,这不太可能是一个问题。
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 对fread的返回值感到困惑
- 程序不向函数返回值
- C++ - 在线程中使用时,将函数的返回值声明为 void/void* 之间有什么区别吗?
- 返回值和副作用编码之间有什么区别
- c++中返回引用与返回值的区别
- 返回值 int& 和 const int& 之间的区别