函数声明中返回类型中的“&符号”是如何工作的?

29
在这段代码中,为什么f()被声明为“double & f(...”?这是什么意思,它是如何工作的?我甚至不知道该怎么搜索来找到答案。请帮忙解答。
double a = 1, b = 2;
double & f (double & d) {
    d = 4;
    return b;
}

我知道&符号表示变量或函数的地址,但我不明白在声明函数时为什么要写它。

5
不。在你的情况下(在那个语境中),&符号表示一个引用。 - Mark Garcia
2
此外,& 符号在此代码片段中的每个出现都表示引用。 - WhozCraig
2
顺便说一下,包含“此函数”或“此代码”等词语的标题几乎没有用处。考虑未来的用户,他们有类似的问题,并希望在SO中找到它--就像您无法找到所需内容一样。当他们遇到最好描述为“返回类型中的和号”或类似问题时,他们不太可能搜索“此函数”。 - jogojapan
2
@jogojapan 更改了标题,感谢您的建议。 - Azad Salahli
3个回答

32
考虑这两个函数:power2()add()
void power2 (double& res, double x) {
    res = x * x;
}

double& add (double& x) {
    return ++x;
}

第一个计算x的幂并将结果存储在第一个参数res中,它不需要返回结果。
第二个函数返回一个引用,这意味着此引用以后可以被赋予新值。
例如:
    double res = 0;

    power2(res, 5);
    printf("%f\n", res);


    printf("%f\n", ++add(res));

输出:

25.000000
27.000000

请注意,第二个输出是27,而不是26 - 这是由于在printf()调用中使用了++的原因。

5
+1 for concrete examples - jogojapan
10
我不是想无礼,但那个例子比较难理解。 - puk
2
@puk,这一点并不无礼。如果您提出了使其更易于理解的想法,那将会更有帮助。如果您认为有一种根本不同的更简单的方法,以至于修改此答案就没有意义,您也可以发布自己的答案。 - kamituel
指出这不是有效的可能更有帮助:int& foo() { return 0; } - searchengine27

19
当在声明形式中使用&运算符时,如果在类型之前,则不表示“地址”,而是表示“引用”,这实际上是一个自动解除引用指针并禁用指针算术的指针。
在C语言中没有引用,因此如果要通过引用传递或返回值,则必须传递const指针并对其进行解引用以访问所指向的值。 C ++添加了引用以使这个概念更容易理解,防止意外地使用指针算术走出地址范围,并节省了解引用指针的需要。这使得使用它更加容易,结果是更清晰和更可读的语法。

6
在这种情况下,&符号并不表示获取地址,而是表示引用。这里,f是一个函数,它以双精度引用作为参数,并返回一个双精度引用。 您可能想在您选择的教材中了解C++的引用,因为它们是语言的基本组成部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接