来自C#背景,我或多或少地对在C++中返回方法处理这种看似奇怪的行为感到困惑.我现在关注的是C++中的一个方法,通过引用返回并不是一个非常有用的技术,这是因为 - 与C#不同 - 一旦控件退出方法,在方法体内声明的任何变量都将超出范围.
所以,在C++中,这甚至无法编译(但C#中的等效版本可以):
int& DoubleValue(int nX)
{
int nValue = nX * 2;
return nValue; // return a reference to nValue here
} // nValue goes out of scope here
Run Code Online (Sandbox Code Playgroud)
通过引用返回有用的唯一时间是返回对类中现有数据成员的引用,或者返回对方法参数内的元素的引用.但在这两种情况下都没有必要归还任何东西; 因为返回的引用已经可以自由地用于方法的调用者.
所以,我的结论是,根本没有必要使用引用返回.我对吗?
Jer*_*ock 11
std::vector<>::operator[]对通过取消引用指针(以及向其添加偏移量)获得的元素的返回引用等操作.在这种情况下,指针是一个private内部成员vector,因此用户无法在不破坏类抽象的情况下获得自己的内容.
这对于返回对堆栈上分配的内容的引用不起作用是正确的.那根本行不通.
但是,通过引用返回仍然非常有用 - 例如,集合的索引操作符可以通过引用返回值,从而使您可以分配给集合中的该元素.
通过引用返回有用的唯一时间是返回对类中现有数据成员的引用,或者返回对方法参数内的元素的引用.
松散地说,是的.变量可能不是由类"拥有"(与其生命周期相关):它可以通过某些早期函数调用或类已知但不属于它的全局/单例指定给类,或者甚至是共享内存或堆中新分配的区域(虽然返回引用而不是指针表明所有权没有给予调用者),但最终类必须具有对该数据的一些访问权限.
但在这两种情况下都没有必要归还任何东西; 因为返回的引用已经可以自由地用于方法的调用者.
不,因为对象可以拥有私有成员和受保护成员,并且可以将友谊授予其他类或函数,因此被调用函数完全有可能访问(并因此返回引用)调用者无法直接访问的某些数据.
此外,许多函数找到一个特定的变量来做一些工作,然后返回对它的引用.如果调用者需要单独调用再次查找该变量,则可能效率低下(以及调用代码中的详细信息).
所以,我的结论是,根本没有必要使用引用返回.我对吗?
不......由于上面的缺陷前提.
通过引用返回的另一个非必要但方便的用途是典型的流功能:
std::ostream& operator<<(std::ostream& os, const X& x)
{
return os << x.str();
}
Run Code Online (Sandbox Code Playgroud)
上面提到的意思是......
std::cout << x << y;
Run Code Online (Sandbox Code Playgroud)
......评估为......
(std::cout << x) << y;
operator<<(operator<<(std::cout, x), y)
Run Code Online (Sandbox Code Playgroud)
所有人都很好地联系在一起.同理:
while (std::cin >> x >> y)
...
Run Code Online (Sandbox Code Playgroud)
... ...不仅因为连续输入到x和y的链接,还因为std :: cin仍然可用于布尔上下文中的评估,最终调用另一个成员函数有效地询问流操作是否有效.