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))
coutvoid 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造成混乱的原因。是在函数定义中(即将参数标记为引用)还是在调用函数时(即作为传递变量的地址)。