C++按引用或值传递
C++ passing by reference or by value?
我是编程新手,这里有一个简单的问题,关于通过引用传递是如何工作的。在这个程序中,我正在计算二次方程的根。
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 之后)。
- 具有默认值的引用获取函数
- 为什么可以将左值传递给"std::async",即使它引用了右值
- 按值捕获引用时出现非常量
- C++带有适用于左值和右值的引用参数的函数
- 按值和引用传递指针之间的区别?
- 当值传递给C++中的运算符重载函数时会发生什么
- 作为赋值(增加引用变量)C++的左操作数所需的左值
- C++模板成员初始化:用右值移动构造,但用左值移动引用
- 这安全吗?右值和引用返回值
- Rcpp 中值和引用参数之间的差异
- put_money是否按值或引用保存其参数
- 如何将非可变参数值传递给 fmt::format?
- 编写两个方法的最佳方法,这些方法在C++中返回同一项的值和引用
- 将 qml 项目值传递给 cpp 后如何与它们进行交互?
- 仅允许从对较长生存期值的引用进行隐式构造
- NDK:将文本字段值传递给 c++ 字符串
- 有没有办法使用基于范围的迭代器来迭代对指针列表值的引用?
- C++,有没有办法制作一个不复制值的引用的构造函数?
- 对r值的引用(r值的地址)
- 如何将值传递给 lambda 函数