我无法理解何时将&
与变量一起使用。我认为它将范围更改为该功能但由于某种原因,此代码无法正常工作
void advanceTimeInMinutes(int& hours, int& minutes, int& advances)
{
if(advances >=60-minutes){
hours++;
minutes=60-minutes+advances;
}else{
minutes +=advances;
}
}
并由
调用advanceTimeInMinutes( hour, minute, 50 );
答案 0 :(得分:1)
在许多编程语言中,用于引用对象的名称与对象本身不同。一个对象可能有多个名称。
在C ++中为一个对象分配多个名称的最直接方法是使用&
说明符声明一个名称。 (此用法与&
运算符不同;说明符不是运算符。)
当您使用&
声明这些参数时,它们将成为作为函数参数传递的对象的别名。这些名称称为引用。
C ++有几种(好的,多种)种类和表达类别。两个重要的概念是可修改性和所有权。传递对函数的引用时,可以选择授予其修改对象和对象所有权的权限。 const
说明符的缺席表示可修改性,使用&&
代替&
表示所有权(这是C ++ 11中的新增内容) )。
不允许函数获得对具有瞬态存在的对象的可修改的非拥有访问,因为它应该能够期望将结果写入这样的对象以返回给调用者。值50
存储在这样的瞬态对象中。
一种解决方案是使用int const & advances
,但更好的解决方案是根本不使用引用,因为您并没有真正尝试使用别名来引用共享对象。
许多人在概念上假设引用是一个自动解除引用的const
指针。这非常有效,编译器几乎总是这样做。但这不一定是真的。例如,给定此类定义:
struct s {
static int x;
int &r = x;
char c;
};
编译器可以确定r
始终引用全局x
,并将r
的每次使用替换为x
。由于无需在每个对象中存储引用,sizeof(s)
可以合法地为1。
这比当前的C ++代码分析更先进,但它不可避免地会在某个时刻出现。面向未来的代码不应期望引用的实现等同于指针。
答案 1 :(得分:0)
&
是参考运算符。它用于更改函数内部的值。上面的代码相当于
void advanceTimeInMinutes(int *hours, int *minutes, int *advances)
{
if(*advances >= 60 - *minutes){
(*hours)++;
*minutes = 60 - *minutes + *advances;
}else{
*minutes += *advances;
}
}
advanceTimeInMinutes(&hour, &minute, &50);
由于数字没有地址,因此会导致错误
答案 2 :(得分:-1)
您无法将文字值作为参考传递。由于您从未设置advance
参数,因此不要通过引用传递它,因此请删除该参数的&
(并将其设为const
(有趣的是,如果你创建参数const
然后你可以使用引用))。