我正在学习c ++,我认为到目前为止一切都很好。我阅读了有关参考资料并做了一些练习(简单)。但是这段代码存在一个理解问题:
const int& GetMax (const int& valuel, const int& value2)
。
任何人都可以帮助我理解为什么它传递带有函数类型的引用以及它将做什么(也在它的参数类型中)?在这种情况下会引用什么???
答案 0 :(得分:5)
C ++中的引用完全,它是一个引用其他变量的变量名。
根据陈述思考:
int xyzzy = 1;
int &plugh = xyzzy;
int twisty = xyzzy;
此处xyzzy
的实际“对象”是包含值1
的内容。您可以通过名称xyzzy
来引用它,但这只是它的名称。
plugh
是对完全相同的基础对象的另一个引用 - 更改plugh
的值也会更改xyzzy
的值,因为这两者都是同名的(引用)名称。
另一方面,twisty
变量是作为新对象创建的,只需将xyzzy
的值复制到其中。
您经常会看到以下内容:
void fn(const string &str1) { ... }
在代码中,因为将引用传递给构造/复制相对昂贵的对象(如字符串)更有效。传递对象的引用允许您直接访问当前存在的对象,并使其const
阻止函数更改它。
使用像int
这样的基本类型完成此操作是非常不寻常的,因为复制它们的成本非常小,通常与传递引用的成本大致相同。
你 偶尔会看到以下内容:
void fn(int &thing) { ... }
但这通常是因为预期会在函数中更改thing
并将更改镜像回调用者。
您的特定代码可能正在做什么(虽然我不能确定没有更多上下文)但是没有创建任何新对象,因为它返回了参考。在我最好的猜测中,以下代码显示了它将具有的实现类型:
const int& GetMax(const int& value1, const int& value2) {
if (value1 >= value2)
return value1;
return value2;
}
使用它,代码:
int val1 = 7;
int val2 = 42;
const int &biggest = GetMax (val1, val2);
实际上会将引用 biggest
设置为引用最大val1
和val2
。换句话说,它在功能上等同于伪代码:
val1 = 7
val2 = 42
if (val1 > val2)
biggest = reference to val1
else
biggest = reference to val2
答案 1 :(得分:0)
如果不通过引用传递int,则无法从函数内部修改它。将修改整数的副本。