引用作为函数参数?

时间:2012-01-19 05:40:01

标签: c++ parameter-passing pass-by-reference

我在引用方面遇到了麻烦。 请考虑以下代码:

void pseudo_increase(int a){a++;}  
int main(){  
    int a = 0;
    //..
    pseudo_increase(a);
    //..
}

此处,变量a的值不会随着克隆或副本的传递而增加,而不会自动变量。
现在让我们考虑另一个例子:

void true_increase(int& a){a++;}
int main(){  
    int a = 0;
    //..
    true_increase(a);
    //..
}

这里说a的价值会增加 - 但为什么呢?

调用true_increase(a)时,将传递a的副本。这将是一个不同的变量。因此&a将与a的真实地址不同。那么a的价值如何增加?

纠正我的错误。

3 个答案:

答案 0 :(得分:6)

考虑以下示例:

int a = 1;
int &b = a;
b = 2; // this will set a to 2
printf("a = %d\n", a); //output: a = 2

此处b可以被视为a别名。无论您分配给b的是什么,也会分配给a(因为b是对a的引用)。传递参数by reference也不例外:

void foo(int &b)
{
   b = 2;
}

int main()
{
    int a = 1;
    foo(a);
    printf("a = %d\n", a); //output: a = 2
    return 0;
}

答案 1 :(得分:5)

  

当调用true_increase(a)时,将传递'a'的副本

那就是你错了。将提及a。这就是参数类型旁边的&。对引用发生的任何操作都将应用于引用。

答案 2 :(得分:1)

在你的true_increase(int& a)函数中,里面的代码是不是你指定的整数值的COPY。它是对整数值驻留在计算机内存中的内存位置的引用。因此,通过该引用所做的任何更改都将发生在您最初声明的实际整数上,而不是它的副本。因此,当函数返回时,您通过引用对变量所做的任何更改都将反映在原始变量本身中。这是在C ++中通过引用传递值的概念。

在第一种情况下,正如您所提到的,使用原始变量的副本,因此您在函数内所做的任何事情都不会反映在原始变量中。