C ++通过引用返回有什么影响?

时间:2016-10-18 09:25:23

标签: c++ reference pass-by-reference return-by-reference

使用以下代码,其中函数通过引用返回:

#include <cstdio>
using namespace std;

int & myFunction(int & input) {
    return input;
}

int main() {
    int x;
    int y = 10;
    x = myFunction(y);
    printf("x is %d\n",x); // x is 10
    printf("y is %d\n",y); // y is 10
    x = 20;
    printf("x is %d\n",x); // x is 20
    printf("y is %d\n",y); // y is 10
    return 0;
}

除了返回对函数的局部变量的引用(这里不是这种情况)的明显缺陷之外,在这种设置中是否有任何需要注意的事项?换句话说,这个代码有什么“比”更简单地通过引用返回东西的函数,以避免不必要的复制操作?

2 个答案:

答案 0 :(得分:1)

您提供的代码之所以有效,是因为您通过引用将变量传递给函数,并仍然通过引用返回它。这是一致的并且有效,但很奇怪。为什么要返回您通过引用传递的相同变量? (我只是从评论中记得这对于std :: ostream中的链接很有用。)

另一方面,如果你按值传递该变量,你将有一个悬空参考,它不会起作用。所以赢了

int & myFunction(int input) {
    return input;
}

在我看来,我认为唯一合适的回报就是你从类的方法中返回一个变量。除此之外,我认为你根本不应该参考。

你可以捕捉一个变量作为一个常量引用,如果你愿意的话可以避免复制它,如果你这样做的话,那就不用d <:

int myFunction(int input) {
    return input;
}

int main()
{
    const int& myInt = myFunction();
    //myInt is still valid here
}

这是一个特例。

答案 1 :(得分:1)

  

除了返回对本地的引用的明显缺陷   函数的变量(这里不是这种情况),有没有   在这种设置中要注意的事项?

不,不是真的,它完全有效,但也没有优势。 (在当前状态myFunction

  

为了避免不必要的复制操作?

这里还有一个副本:

int x;
int y = 10;
x = myFunction(y); // value of y is copied to x.

这不太可读,并且在正常初始化时不会加速任何事情:

int x;
int y = 10;
x = y;

在这种情况下没有理由这样做,只需坚持正常的初始化。

当然,如果myFunction对比int&更复杂的对象添加某种修改,那么您可以利用返回引用,然后就可以了:

chain.method().calls();