C++按引用或值传递

C++ passing by reference or by value?

本文关键字:值传 引用 C++      更新时间:2023-10-16

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

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 的函数定义中,我似乎接受引用作为参数,并且对它是如何工作的感到困惑?

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

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

例如

#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 中传递值或引用。函数定义为您决定。无论按值传递还是按引用传递,调用函数的格式都保持不变。

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

这说,"我取 3 个参数 - 所有类型 double &(参考双精度)。参考与指针非常混淆,所以我建议您先阅读本文。

让我们将主内部的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 的值并使用新副本,而不是使用原始传递的副本。

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 函数中发生变化,则三个变量的值也会在主函数中更改。

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

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

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

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