用c ++语言引用

Fir*_*aev 1 c++

我正在学习c ++,我认为到目前为止一切都很好.我阅读了有关参考资料并做了一些练习(简单).但是这段代码存在一个理解问题:

const int& GetMax (const int& valuel, const int& value2).

任何人都可以帮助我理解为什么它传递带有函数类型的引用以及它将做什么(也在它的参数类型中)?在这种情况下会引用什么?

pax*_*blo 5

C++中的引用正是如此,它是一个引用其他变量的变量名.

考虑一下这些陈述:

int xyzzy  = 1;
int &plugh = xyzzy;
int twisty = xyzzy;
Run Code Online (Sandbox Code Playgroud)

这里的实际"对象" xyzzy是包含值的东西1.你可以通过它的名字来引用它,xyzzy但这只是它的名字.

plugh是对完全相同的底层对象的另一个引用- 更改值也plugh将更改值,xyzzy因为这些都是(引用)同名的名称.

twisty另一方面,该变量被创建为一个对象,并简单地将其值复制xyzzy到它.


你会经常看到这样的事情:

void fn(const string &str1) { ... }
Run Code Online (Sandbox Code Playgroud)

在代码中,因为将引用传递给构造/复制相对昂贵的对象(如字符串)更有效.传递对象的引用允许您直接访问当前存在的对象,并使其const阻止函数更改它.

使用基本类型完成此操作是非常不寻常的,int因为复制它们的成本非常小,通常与传递引用的成本大致相同.

偶尔看到喜欢的东西:

void fn(int &thing) { ... }
Run Code Online (Sandbox Code Playgroud)

但这通常是因为thing预期会在函数中更改,并且更改会被镜像回调用者.


你的特定代码可能正在做什么(虽然我不能确定没有更多的上下文)是由于返回引用而没有创建任何新对象.在我最好的猜测中,以下代码显示了它将具有的实现类型:

const int& GetMax(const int& value1, const int& value2) {
    if (value1 >= value2)
        return value1;
    return value2;
}
Run Code Online (Sandbox Code Playgroud)

有了它,代码:

int val1 = 7;
int val2 = 42;
const int &biggest = GetMax (val1, val2);
Run Code Online (Sandbox Code Playgroud)

实际上会将引用 设置为引用biggest最大的val1val2.换句话说,它在功能上等同于伪代码:

val1 = 7
val2 = 42
if (val1 > val2)
    biggest = reference to val1
else
    biggest = reference to val2
Run Code Online (Sandbox Code Playgroud)

  • @taskinoor:我根据问题中的新信息更新了我的答案.因为要将*reference*返回给变量,所以需要使用寿命超出函数的变量.换句话说,按值传递参数和局部参数不在等式中. (2认同)