7

在 c++ 中,在什么情况下我们必须从函数返回引用?我理解使用引用作为函数输入,但是对于函数输出,为什么我们不能只返回值或指针?

4

5 回答 5

9

引用用于提供对函数返回值的赋值。听起来很奇怪,但举个例子,c++ 中的数组赋值运算符是一个函数,它实际上返回对索引参数处元素的引用,以便可以将其分配给,例如

class Array {
 public:
  int& operator[] (const int& index);
  ...
};

允许以下语法:

Array a;
a[4] = 192;

受到永远有用的 C++ FAQ 的启发:

https://isocpp.org/wiki/faq/references#returning-refs

于 2013-08-05T17:55:18.443 回答
4

我不确定在哪些地方您必须返回参考。

重载operator++()浮现在脑海中,但仍然没有强制要求返回参考。但是,通常的规则适用:如果您可以返回指向某物的指针,则在大多数情况下您可以安全地返回引用。关键是不要返回对超出范围的引用 - 例如该函数的本地变量。返回一个引用*this是很常见的。

返回一个值是一件很有价值的事情,因为它要么 (A) 复制返回的东西,要么 (B) 最大限度地利用移动语义 (C++11) 和/或返回值优化(维基百科上的 RVO)。

如果您不需要或不想要副本,那么通过引用返回值类型通常是您想要的,因为您不太可能需要类似指针的用法,即必须使用*or取消引用返回的东西->

于 2013-08-05T17:52:15.597 回答
1

如果在调用函数之前对象已经存在,则可以返回引用。那么这不是问题。

这篇文章总结的很好。 返回 C++ 引用变量的做法是邪恶的吗?

于 2013-08-05T17:47:15.300 回答
0

从函数返回引用与返回指针具有相同的优点和缺点。

返回非常量引用或指针允许调用者写入成员变量并调用非常量成员函数。

但是,引用的对象最好有比调用者要求的更长的生命周期,否则程序会进入未定义行为的领域。

关于必须返回引用的主题,它对语法糖和运算符一样有用,如果返回指针,则需要调用者取消对指针的引用。

于 2013-08-05T17:49:43.867 回答
0

请记住,您需要返回对函数终止后将存在的对象的引用。例如,您可以执行以下操作:

Val(X,10) = 1;

whereVal是一个函数,它返回(比如说)对列表中第 10 个元素的引用,从而将其设置为1.

于 2013-08-05T17:52:18.010 回答