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 );
4

3 回答 3

1

在许多编程语言中,您用来指代对象的名称与对象本身不同。一个对象可能有多个名称。

在 C++ 中为一个对象分配多个名称的最直接方法是使用说明&符声明一个名称。(此用法与& 运算符不同;说明符不是运算符。)

当您用 声明这些参数时&,它们将成为作为参数传递给函数的对象的别名。此类名称称为引用

C++ 有几种(好吧,很多)种类和类别的表达式。两个重要的概念是可修改性和所有权。当您传递对函数的引用时,您可以选择授予它修改对象的权限以及对象的所有权。可修改性由指定符的缺失表示const,所有权由使用&&而不是表示表示&(这是 C++11 中的新功能)。

不允许函数获得对仅存在短暂存在的对象的可修改、非拥有访问权,因为它应该能够期望将结果写入这样的对象以返回给调用者。该值50存储在这样的瞬态对象中。

一种解决方案是使用int const & advances,但更好的解决方案是根本不使用引用,因为您并没有真正尝试使用别名来引用共享对象。


许多人在概念上假设引用是自动取消引用的const指针。这工作得很好,编译器几乎总是以这种方式做事。但这不一定是真的。例如,给定这个类定义:

struct s {
    static int x;
    int &r = x;
    char c;
};

编译器可以确定它r始终引用全局x,并替换每次使用rwith x。无需在每个对象中存储引用,sizeof(s)合法地可以是 1。

这比当前的 C++ 代码分析更先进,但它不可避免地会在某个时候出现。面向未来的代码不应期望引用的实现等同于指针。

于 2013-10-11T02:53:21.880 回答
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);

由于数字没有地址,所以会导致错误

于 2013-10-11T02:34:49.547 回答
-1

您不能将文字值作为参考传递。由于您从未设置advance参数,因此不要通过引用传递它,因此请删除&for 该参数(并同时进行const(有趣的是,如果您提出参数,const可以使用引用))。

于 2013-10-11T02:32:25.403 回答