C++ C++;通过引用还是通过值传递?

C++ C++;通过引用还是通过值传递?,c++,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(st

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

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;
}
所以,我的问题是,我似乎正在将值从主程序传递给GetCourters和SolveSquadratic,但在GetCourters和SolveSquadratic的函数定义中,我似乎接受引用作为参数,并且对这是如何工作的感到困惑

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

例如,函数GetCourtifies,变量a、b、c是通过引用传递的,因此,如果三个变量的值在GetCourtifies函数中发生变化,则这三个变量的值在主函数中也会发生变化。

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

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

比如说,

#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
}
#包括“iostream”
使用名称空间std;
void function1(int&x,int y)//x通过引用传递
{
x+=y;
}
void function2(int x,int y)//x通过值传递
{
x+=y;
}
int main()
{
int x=10;
function1(x,10);//x是通过引用传递的(调用时不传递(&N))
cout
void getcoverties(双a双b双c);

这意味着,“我使用了3个参数——所有类型的
double&
(对double的引用)。引用与指针非常混淆,因此我建议您

让我们调用main中的
a、b、c
作为main\u方法变量

当您调用
getcoverties
时,此函数对其中传递的变量所做的任何操作都会反映在主方法变量上。实际上,此方法与主方法变量一起工作


如果您有
void getcoverties(双a、双b、双c)
,这意味着无论何时使用主方法变量调用此方法,此方法都将复制
a、b、c的值,并使用新的副本,而不是使用传递给它的原始副本。

虽然不是直接的答案,但您可以查看主题“变量范围”。它将解释符号“a”、“b”的原因在不同的函数中,局部变量的概念是理解“按值传递”、“按指针传递”和“按引用传递”的先决条件

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

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


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

传递引用允许被调用的函数修改传递给它的变量(这不同于按值传递,函数只接收值的副本)。在您的例子中,根据函数名,我假设
getcoverties
填充
a、b、c
,然后
solveQuadratic
接收这些系数(按值)并填充根
x1,x2
,然后最后
printRoots
打印
x1,x2
值。其工作原理:语法黑魔法。编译器发现需要使用引用调用函数,并生成适当的代码,以便在无需任何进一步用户干预的情况下实现。我认为这并不完全是错误的上面链接的问题的副本。OP对在
main
@AnukulSangwan中传递值/引用感到困惑,当closer归于社区时,这意味着询问者自己批准了副本。对不起,我根据问题中的内容进行了评论。
我的问题是,我似乎在传递值要从主程序中获取系数和SolveSquadratic,但在GetCourters和SolveSquadratic的函数定义中,我似乎接受引用作为参数,并对其工作原理感到困惑?
建议改写最后一段的第一句话:“您不决定是否在调用函数中传递值或引用。被调用函数的定义决定了这一点。“通过删除
main
上的错误依赖项来概括答案。感谢您提供了详细的响应。我能够理解您希望通过引用传递值以在调用函数中反映更改,以及为什么x两次都是20。但是,我仍然不明白您为什么不使用function1(&x,10)在main function?@tacqy2中,您不需要
&
,因为它不是指针。它是一个引用,不需要将地址传递给被调用的函数。@PaulRooney ah,我明白了。这很有意义。谢谢:)@Ankul Sangwan另一方面,当您按值传递变量时(不使用&),
有点混乱。不清楚何时何地使用
&
,可能是OPs造成混乱的原因。是在函数定义中(即将参数标记为引用)还是在调用函数时(即作为传递变量的地址)。