C ++通过引用或值传递?

时间:2016-02-28 06:17:15

标签: c++

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

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

4 个答案:

答案 0 :(得分:3)

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

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

例如,

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

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

您无法决定是否在main中传递值或引用。功能定义为您决定。无论通过值传递还是通过引用传递,调用函数的格式都保持不变。

答案 1 :(得分:1)

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

这说,&#34;我接受3个参数 - 所有类型double &(引用双精度)。引用与指针相当混淆,所以我建议你read this up first.

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

答案 2 :(得分:0)

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函数中更改,则三个变量的值也将在main函数中更改。

答案 3 :(得分:0)

虽然不是直接答案,但您可以查看主题&#34;变量范围&#34;。它可以解释为什么符号&#34; a&#34;,&#34; b&#34;和&#34; c&#34;可能会也可能不会在不同的功能中代表相同的东西。局部变量的概念是理解&#34;传递值&#34;,&#34;传递指针&#34;的前提条件。并且&#34;通过引用传递&#34;。

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

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

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