【问题标题】:Why we have to pass the values instead of the address into a "call by reference" function in C++?为什么我们必须将值而不是地址传递给 C++ 中的“引用调用”函数?
【发布时间】:2017-09-19 03:54:50
【问题描述】:

我是 C++ 新手,现在通过引用学习调用。

我在我的资料中学到了这段代码:

void callByRef(&a, &b);

int main(){
    int k = 12;
    int m = 4;
    callByRef(k, m) //QUESTION HERE
    return 0;
}

void callByRef(&a, &b){
    a += 3;
    b -= 2;
    return;
}

所以我的问题是在声明callByRef时,我们使用a和b的地址作为参数,所以我们在main中调用callByRef时,为什么需要传入(k, m)而不是(&k, &m) ?

这是基本的,但我只是想为我未来的学习拍一张合适的照片。 谢谢大家!

【问题讨论】:

  • "我们用a和b的地址作为参数"什么?声明应该类似于void callByRef(int& a, int& b),这不是获取参数的地址,而是将它们声明为引用。
  • void callByRef(&a, &b)is not legal C++。如果您的课程材料包含这些内容,您应该投诉并要求退款。

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


【解决方案1】:

&a的运算符表示变量a的地址,*a的运算符表示变量a寻址的内存内容。现在函数定义如下:

void callByRef(int &a, int &b){
    a += 3;
    b -= 2;
    return;
}

其中int &a 表示对于某个int 类型的变量,a 将是reference。因此,每当您调用该函数时,您需要传递变量本身而不是其地址,因此是callByRef(a, b) 而不是callByRef(&a, &b)

这样声明的原因如下,传给函数的参数,传值,也就是把变量的内容字面上复制到函数变量中,所以函数内部对它的任何改变都不会产生任何影响。例如:

void callByVal(int a, int b){
    a += 3;
    b -= 2;
    return;
}

并且拥有:

x = 5;
y = 10;

调用callByVal(x, y) 不会对x 和y 产生任何影响。为了克服这个问题,您需要通过引用或int &a 传递参数,或者您可以直接传递指针并更新内存:

void callByPtr(int *a, int *b){
    *a += 3;
    *b -= 2;
    return;
}

现在传递变量地址是有意义的,例如callByPtr(&a, &b).

【讨论】:

    【解决方案2】:

    callByRef() 函数将引用作为参数传递,因此您无需向函数发送显式引用。阅读本文以更好地理解。

    Tutorial

    【讨论】:

    • 感谢您的回答 haha​​hakebab!现在阅读。
    【解决方案3】:

    你没有传递价值。 C++ 中的引用并不完全像指针。将它们简单地视为对象的另一个名称。

    当然,您需要将该名称​​绑定到一个对象,以便引用引用它。因此,例如当我们写int &i = k; 时,我们是说已经命名为k 的变量可以称为i。要绑定引用,我们需要 name 另一个对象。并且对象的名称是k,而不是&k

    这同样适用于函数参数和参数。指定函数callByRef 对两个对象进行操作,它将调用ab。当您调用该函数时,您必须 name 它将引用的原始对象。并且原始对象被命名为km,而不是&k&m

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多