何时使用&在C ++中声明变量?

时间:2013-10-11 02:29:56

标签: c++ reference ampersand

我无法理解何时将&与变量一起使用。我认为它将范围更改为该功能但由于某种原因,此代码无法正常工作

void advanceTimeInMinutes(int& hours, int& minutes, int& advances)
{
    if(advances >=60-minutes){
        hours++;
        minutes=60-minutes+advances;
    }else{
        minutes +=advances;
    }
}

并由

调用
advanceTimeInMinutes( hour, minute, 50 );

3 个答案:

答案 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然后你可以使用引用))。