9

我了解 C++ 中引用的概念,并且了解它们在函数参数中使用时的作用,但我仍然对它们如何处理返回类型感到非常困惑。

例如,在参数中使用时,此代码:

int main (void) {
  int foo = 42;
  doit(foo);
}

void doit (int& value) {
  value = 24;
}

类似于此代码:

int main (void) {
  int foo = 42;
  doit(&foo);
}

void doit (int* value) {
  *value = 24;
}

(知道每次在doit的第一个代码示例中使用 value 时,编译器都会自动在value前面加上一个星号,但在后者中,每次尝试使用value时都必须自己加上星号)

那么当用作参考时,下一个代码(在返回类型中使用参考)转换为什么?它是否返回一个指向 int 的指针?或者它只会返回一个int?

int main (void) {
  int* foo = /*insert useful place in memory*/;
  foo = doit(foo);
}

int& doit (int* value) {
  //insert useful code
}
4

4 回答 4

24

It means you return by reference, which is, at least in this case, probably not desired. It basically means the returned value is an alias to whatever you returned from the function. Unless it's a persistent object it's illegal.

For example:

int& foo () {
    static int x = 0;
    return x;
}

//...
int main()
{
    foo() = 2;
    cout << foo();
}

would be legal and print out 2, because foo() = 2 modifies the actual value returned by foo.

However:

int& doit () {
    int x = 0;
    return x;
}

would be illegal (well, accessing the returned value would), because x is destroyed when the method exits, so you'd be left with a dangling reference.

Returning by reference isn't common for free functions, but it is for methods returning members. For example, in the std, the operator [] for common containers return by reference. For example, accessing a vector's elements with [i] returns an actual reference to that element, so v[i] = x actually changes that element.

Also, I hope that "is essentially equal to this code" means that they're semantically sort of (but not really) similar. Nothing more.

于 2012-12-05T07:47:44.587 回答
4

这意味着您返回一个指向对应数据所在的内存地址的指针,而不是数据本身。

于 2012-12-05T20:40:43.163 回答
1

假设此代码(使其与第一个示例相当):

int main (void) {
  int* foo = /*insert useful place in memory*/;
  *foo = doit(foo);
}

int& doit (int* value) {
  *value = 24;
  return *value;
}

在这种int&情况下,作为返回类型并没有真正有用,因为它提供了对内存中变量的访问(您将指针传递给函数)。

它是否返回一个指向 int 的指针?或者它只会返回一个int?

不,它返回对 int 的引用。如果你愿意,你可以把它看成一个指针,它不能nullptr

于 2012-12-05T08:02:35.230 回答
0

嗯,知道答案的最好方法是尝试一下……

您的代码不会通过类型检查,因为当您接受返回值作为 int 的指针时,doit 将返回对 int 的引用。

你可以看看这个:

#include<iostream>
using namespace std;
int& doit (int* value) {
    value[0] = 3;
    return value[4];
}
int main (void) {
  int* foo = new int[10];
  for (int i=0; i<10; i++)
    foo[i] = i;
  int& bar = doit(foo);
  cout<<bar<<endl;
  for (int i=0; i<10; i++)
      cout<<foo[i]<<" ";
  cout<<endl;
  bar = 12;
  for (int i=0; i<10; i++)
      cout<<foo[i]<<" ";
  cout<<endl;
  return 0;
}

变量“bar”将接受返回值,可以用来改变“foo”的内容。正如 Luchian 所提到的,从函数返回引用可能很危险,因为后面的代码可能会修改堆栈中的值。

于 2012-12-05T07:58:10.500 回答