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