返回引用是什么意思? 我理解C++中引用的概念,我理解在函数参数中使用它们时所做的事情,但我仍然很困惑它们如何使用返回类型。

返回引用是什么意思? 我理解C++中引用的概念,我理解在函数参数中使用它们时所做的事情,但我仍然很困惑它们如何使用返回类型。,c++,parameters,reference,return-type,C++,Parameters,Reference,Return Type,例如,在参数中使用时,此代码: 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; } 与此代码类似: int main (void) { int foo = 42

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

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;
}
与此代码类似:

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的第一个代码示例中使用值时,编译器都会自动将星号放在值的前面,但在后者中,每次尝试使用值时,您都必须将星号放在自己的前面)

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

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

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

这意味着您通过引用返回,至少在本例中,这可能是不需要的。它基本上意味着返回值是从函数返回的任何内容的别名。除非它是持久对象,否则它是非法的

例如:

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

//...
int main()
{
    foo() = 2;
    cout << foo();
}
将是非法的(好吧,访问返回值将是非法的),因为当方法退出时,
x
将被销毁,因此将留下一个悬空引用

通过引用返回对于自由函数来说并不常见,但对于返回成员的方法来说却是如此。例如,在
std
中,普通容器的
操作符[]
通过引用返回。例如,使用
[i]
访问向量的元素会返回对该元素的实际引用,因此
v[i]=x
实际上会更改该元素


另外,我希望“本质上等同于此代码”意味着它们在语义上有点类似(但不是真的)。没什么了。

嗯,知道答案的最好办法就是试试

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

你可以看看这个:

#包括
使用名称空间std;
int&doit(int*值){
数值[0]=3;
返回值[4];
}
内部主(空){
int*foo=新int[10];
对于(int i=0;i假设此代码(使其与第一个示例相比较):

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

它是返回指向int的指针,还是只返回int

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

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

不,它返回一个对int的引用。如果您愿意,您可以将其视为一个指针,它不能是
nullptr

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

它将返回一个对int的引用,一个您可以认为是命名指针的引用,但没有指针的所有原始功能。所有这些的一个大问题是,返回一个引用到一个很可能是在堆栈上创建的对象时,当函数返回并且函数堆栈被清理时,你会有一些严重的内存问题。所以,请注意,仅仅因为它是一个引用,并不意味着你会nt有内存问题,对于引用来说,情况更糟,因为内存问题是隐藏的。谢谢Luchian,这帮了大忙!是的,我的意思是“相似”。我将对其进行编辑以备将来引用。为了帮助清理,return by reference将返回您试图返回的任何对象的地址。显然,您不希望返回具有本地作用域的对象的地址,因为调用函数时该对象将被销毁,这将给您留下一个悬空引用(这反过来可能会导致在释放bug后使用)。因此,正如Luchian所说,在返回成员时,很好地使用引用返回。@MrMeganFox引用返回不返回地址,它返回一个别名。@LuchianGrigore:不,它返回一个引用,而不是别名。引用通常通过在引擎盖下使用机器地址来实现。@chrisdd引用是一个别名所指对象的“别名”-同一对象的不同名称。