【问题标题】:References as function arguments?引用作为函数参数?
【发布时间】:2012-02-13 20:18:53
【问题描述】:

我在引用方面有问题。 考虑这段代码:

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的价值是如何增加的呢?

纠正我的错误。

【问题讨论】:

  • 您可能应该为函数参数和传递给它的变量使用不同的标识符,这样您就不会进一步混淆自己。
  • 通过引用传递不会创建副本。它是对同一个变量的引用。
  • 我建议您先了解指针,然后再了解引用如何减少未初始化对象和无效指针等带来的痛苦。选择任何您喜欢的 C/C++ 书籍!

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


【解决方案1】:

考虑以下示例:

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;
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      那就是你错了。将引用a。这就是参数类型旁边的&。发生在引用上的任何操作都会应用于所指对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-12
        • 2019-07-14
        相关资源
        最近更新 更多