【问题标题】:C++ passing by reference or by value? [duplicate]C++ 通过引用还是按值传递? [复制]
【发布时间】:2016-06-11 07:18:51
【问题描述】:

我是编程新手,这里有一个关于按引用传递如何工作的简单问题。在这个程序中,我正在计算一个二次方程的根。

void getCoefficients(double &a, double &b, double &c);
void solveQuadratic(double a, double b, double c, double &x1, double &x2);
void printRoots(double x1, double x2);

void error(string msg);

int main() {
        double a,b,c,x1,x2;
        getCoefficients(a,b,c);
        solveQuadratic(a,b,c,x1,x2);
        printRoots(x1,x2);
        return 0;
}

所以,我的问题是我似乎是从主程序向 getCoefficients 和 solveQuadratic 传递值,但是在 getCoefficients 和 solveQuadratic 的函数定义中,我似乎接受引用作为参数并且对它的工作原理感到困惑?

【问题讨论】:

  • 传递一个引用可以让被调用的函数修改传递给它的变量(这与按值传递不同,函数只接收值的副本)。在您的情况下,按照函数名称,我假设getCoefficients 填充a, b, c,然后solveQuadratic 接收这些系数(按值)并填充根x1, x2,最后是@987654326 @ 打印 x1, x2 值。
  • 工作原理:语法黑魔法。编译器看到需要使用引用调用该函数,并生成适当的代码以使其发生,而无需任何进一步的用户干预。
  • 我不认为这完全是上面链接的问题的重复。 OP 对在 main 中传递值/引用感到困惑。
  • @AnukulSangwan 当关闭者归属于社区时,这意味着提问者自己批准了副本。
  • 对不起,我根据问题中所写的内容发表了评论。 my question is I seem to be passing values to getCoefficients and solveQuadratic from main program but in the function definitions of getCoefficients and solveQuadratic, I seem to be accepting references as arguments and am confused as to how this works?

标签: c++


【解决方案1】:

通过引用传递变量时,您在函数中对其所做的任何更改都会反映在调用函数中。

另一方面,当您按值传递变量时,对其所做的更改是本地的,因此不会反映在调用函数中。

例如,

#include "iostream"
using namespace std;

void function1(int &x, int y) // x passed by reference
{
    x+=y;
}

void function2(int x, int y) // x passed by value
{
    x+=y;
}

int main()
{
    int x=10;
    function1(x, 10);  // x is passed by reference (no & while calling)
    cout << x << endl; // 20
    function2(x, 1000);// x is passed by value
    cout << x << endl; // 20
}

请注意,无论您在对 function2 的调用中传递的 y 的任何值都不会对第二个 cout 语句产生任何影响。

您无法决定是否在main 中传递值或引用。函数定义为您决定。不管是传值还是传引用,调用函数的格式都是一样的。

【讨论】:

  • 建议改写最后一段的第一句:“你不决定是否在调用函数中传递值或引用。被调用函数的定义由你决定。”通过消除对main 的错误依赖来概括答案。
  • 感谢您的详细回复。我能够理解人们想通过引用传递值以使更改反映在调用函数中,以及为什么 x 两次都是 20。但是,我还是不明白你为什么不在 main 函数中使用 function1(&x,10)?
  • @tacqy2 你不需要&amp; 因为它不是一个指针。它是一个引用,不需要将地址传递给被调用的函数。
  • @PaulRooney 啊,我明白了。这就说得通了。谢谢:)
  • @Ankul Sangwan 这句话On the other hand, when you pass a variable by value (not using &amp;), 有点混乱。目前尚不清楚您打算在何时何地使用&amp;,并且可能是 OP 造成混淆的根源。是在函数定义中(即将参数标记为引用)还是在调用函数时(即作为传递变量的地址)。
【解决方案2】:

void getCoefficients(double &amp;a, double &amp;b, double &amp;c);

这表示,“我采用 3 个参数 - 所有类型为 double &amp;(引用双精度)。引用与指针有很多混淆,所以我推荐你 read this up first.

我们将 main 中的 a,b,c 称为 main_method_vars

当您调用getCoefficients 时,该函数对其中传递的变量所做的任何事情都会反映在main_method_vars 上。实际上,此方法适用于 main_method_vars

如果您有void getCoefficients(double a, double b, double c),这意味着每当您使用main_method_vars 调用此方法时,此方法将复制a,b,c 的值并使用新副本,而不是使用原件将副本传递给它。

【讨论】:

    【解决方案3】:
    void getCoefficients(double &a, double &b, double &c);
    void solveQuadratic(double a, double b, double c, double &x1, double &x2);
    

    例如,函数 getCoefficients,变量 a,b,c 是通过引用传递的,所以如果三个变量的值在 getCoefficients 函数中发生变化,它们的值也会在主函数中发生变化。

    【讨论】:

      【解决方案4】:

      虽然不是直接的答案,但您可以查看“可变范围”主题。它可以解释为什么符号“a”、“b”和“c”在不同的功能中可能代表也可能不代表相同的事物。局部变量的概念是理解“值传递”、“指针传递”和“引用传递”的前提。

      您也可以进行第一次测试:尝试更改其中一个函数中的参数名称,例如getCoefficients(double &amp;first,double&amp;second,double &amp;third)

      您也可以进行第二个测试:尝试调用solveQuadratic(10, 20, 30, x1,x2)getCoefficients(1,-2,1)。第一个应该可以工作,但第二个不行。

      最后,您可以尝试第三个测试:更改printRoots函数中参数x1 和x2 的值。然后检查这些变化是否也发生在主函数中(当然是在调用 printRoot 之后)。

      【讨论】:

        猜你喜欢
        • 2020-04-01
        • 2016-03-10
        • 2013-02-09
        • 2013-05-03
        • 2013-01-21
        • 1970-01-01
        • 2014-04-08
        • 2016-12-13
        • 1970-01-01
        相关资源
        最近更新 更多