通过参考返回没用吗?

Gra*_*ton 7 c++

来自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,因此用户无法在不破坏类抽象的情况下获得自己的内容.

  • 作为OP的好处的一个例子:`vector <int> xs(10); xs [5] = 42;`如果没有重载运算符返回的引用,则该赋值不可能发生. (2认同)

Rom*_*kov 5

这对于返回对堆栈上分配的内容的引用不起作用是正确的.那根本行不通.

但是,通过引用返回仍然非常有用 - 例如,集合的索引操作符可以通过引用返回值,从而使您可以分配给集合中的该元素.


Ton*_*roy 5

通过引用返回有用的唯一时间是返回对类中现有数据成员的引用,或者返回对方法参数内的元素的引用.

松散地说,是的.变量可能不是由类"拥有"(与其生命周期相关):它可以通过某些早期函数调用或类已知但不属于它的全局/单例指定给类,或者甚至是共享内存或堆中新分配的区域(虽然返回引用而不是指针表明所有权没有给予调用者),但最终类必须具有对该数据的一些访问权限.

但在这两种情况下都没有必要归还任何东西; 因为返回的引用已经可以自由地用于方法的调用者.

不,因为对象可以拥有私有成员和受保护成员,并且可以将友谊授予其他类或函数,因此被调用函数完全有可能访问(并因此返回引用)调用者无法直接访问的某些数据.

此外,许多函数找到一个特定的变量来做一些工作,然后返回对它的引用.如果调用者需要单独调用再次查找该变量,则可能效率低下(以及调用代码中的详细信息).

所以,我的结论是,根本没有必要使用引用返回.我对吗?

不......由于上面的缺陷前提.

通过引用返回的另一个非必要但方便的用途是典型的流功能:

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仍然可用于布尔上下文中的评估,最终调用另一个成员函数有效地询问流操作是否有效.