如果参数传递两次,会发生什么情况?一次按值,一次按引用?是否会修改
What happens to a parameter if it is passed twice? Once by value and once by reference? Will it be modified or not?
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("BAC.TXT");
void eval(int a, int b, int &rez)
{
rez = a + b;
}
int main()
{
int nr;
int s;
fin >> s;
while (fin >> nr)
eval(s, nr, s);
cout << s << 'n';
return 0;
}
所以我有这个代码片段。我正在从文件中读取数字,并使用称为"eval"的给定函数跟踪它们的总和。我知道将参数传递两次(在这样的给定实例中)而不是使用另一个变量(不过,不确定它是否是坏代码,在我的情况下)可能会被认为是糟糕的代码)。我的问题是:它会改变变量s
的值吗?同样,我按值传递一次,按引用传递一次!我已经在我的电脑上编写了代码,它确实改变了s
的值。现在我的问题是:为什么?如果我以正确的方式问这个问题:"在后台"会发生什么?
a
是s
的副本这一事实实际上是一个红鲱鱼。也许这引起了您的困惑,但它只是一个副本。考虑你可以像这样调用函数
auto temp = s;
eval(temp,nr,s);
以获得完全相同的结果。函数内部rez
是对s
的引用,因此对它的修改将反映在main
中的s
上。换句话说,rez
是s
的别名,而a
与s
没有任何关系,它们恰好具有相同的值。
这个问题与函数参数和引用/指针的行为有关。
当您将值传递给函数时,它会复制您为函数内的局部变量提供的值。
在您的情况下,当您传递"s"时,它会将其复制到"a",就像您在 main 中一样:int a = s(这是正在发生的事情)
这同样适用于引用。当您将"s"传递给第三个参数时,它会这样做:
int &rez = s
当你通过引用传递它时,它有点像获取变量的地址而不是值本身,并将这个地址复制到已经取消引用的局部变量。(指针的东西)
因此,该值已更改。
观看与指针相关的视频,然后在"切尔诺项目"YouTube频道上参考,以更好地理解该主题:
指针
引用
简短回答:是的,s
将被更改。
长答案:让我稍微重写一下您的代码片段,以说明调用期间函数参数发生了什么:
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("BAC.TXT");
void eval(int a, int b, int &rez)
{
rez = a + b;
}
int main()
{
int nr;
int s;
fin >> s;
while(fin >> nr) {
int a = s;
int b = nr;
s = a + b;
}
cout << s << 'n';
return 0;
}
因此,基本上,a
和b
分别只是s
和nr
的副本。但是,res
s
.
IMO,这就是我所期望的:
- 将
s
复制到新的变量l_S
。 - 将
nr
复制到新的 varl_Nr
。 - 将
&s
复制到新的变量l_Ptr
。 - 添加
l_Nr
和l_S
。 - 将结果保存在
*l_Ptr
中。
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 什么是仅调用一次并调用参数的控制台应用
- 如何确保用户在一行上提示输入一次时输入名字和姓氏?
- (C++)虽然循环一次不起作用,但我引入了多个变量
- 为什么在C/C++中的while循环中只发生一次取消引用
- 如果参数传递两次,会发生什么情况?一次按值,一次按引用?是否会修改
- C++重载getter两次,一次返回指针,另一次返回常量引用,都失败了
- 如何使用一次通过引用变量来反转链表
- SQLite在最后一次引用共享行时删除该行