所以我开始学习C ++并且发现了这个例子 -
#include <iostream>
void doIt(int x)
{
x = 3;
int y = 4;
std::cout << "doIt: x = " << x << " y = " << y << std::endl;
}
int main()
{
int x = 1;
int y = 2;
std::cout << "main: x = " << x << " y = " << y << std::endl;
doIt(x);
std::cout << "main: x = " << x << " y = " << y << std::endl;
return 0;
}
- 并且对于调用doIt()的序列,doit:x = 3 y = 4。也许有一些未知的东西我可以搜索以更好地理解发生了什么,但基本上我想知道的是x是作为变量传递给函数还是作为其值(1)。如果它被传递为1,是否会出现错误?这是否意味着该函数需要一个整数变量而不是一个独立的整数?这个程序旨在展示这些变量是如何局部的,但我不确定它们是如何组合在一起的。
答案 0 :(得分:0)
变量不会传递给函数 - 值是。 (如果我们说&#34;变量被传递给函数&#34;,它只是说变量的值被传递给函数)
当doIt
被调用时,x
中的y
和doIt
是全新变量,与main
。第一个参数的值(x
中的main
的值,即1)存储在x
中。然后,3存储在x
中(由行x = 3;
)。然后,4存储在y
中。然后打印x
和y
,其中包含值3和4。
doIt
返回后,main
的变量尚未被更改,因为它们是不同的变量(巧合地具有相同的名称)。所以main
再次打印1和2。
答案 1 :(得分:0)
x按值传递,但在方法中创建了新的x。新x将具有传递给方法的值。新x的范围受限于方法:局部变量。
您可以为本地x分配一个新值,就像您的代码一样。它不会影响调用方法中的变量。
答案 2 :(得分:0)
当函数采用普通参数(例如int x
)时,编译器会将VALUE传递给被调用函数(也称为“被调用者”)。在被调用者内部,该值存储在局部变量[1]中,因此当您通过说x = 3
更新它时,函数内的COPY会更新,而不是调用者中的原始值。
这是一件好事,因为这意味着你可以将一个值传递给一个函数,而不管函数是否改变它都不知道。
如果你想修改输入变量的值,它需要是一个引用,void doIt(int &x)
- 在这种情况下,编译器将通过引用传递实际变量,这样你就可以修改它[技术上,这意味着传递变量的地址,而不是它的内容,然后传递被调用者中的相关代码来处理差异]。
[1]是的,从技术上讲,该副本通常是在来电代码处完成的。
答案 3 :(得分:0)
将整数传递给函数doIt(int x)
时,将复制传递的int
。因此,您对x
正文中的doIt()
所做的任何操作都将仅限于doIt()
请注意,变量的名称可以相同,也可以不同。没什么区别。如果您通过VALUE,则始终会复制变量内容。
#include <iostream>
void doIt(int x) //x here is completely different value than in main
//even though they have the same name
{
x = 3; //this variable has its own scope
int y = 4;
std::cout << "doIt: x = " << x << " y = " << y << std::endl;
} //at the end of this function x is destroyed
int main()
{
int x = 1;
int y = 2;
std::cout << "main: x = " << x << " y = " << y << std::endl;
doIt(x); //the content of variable x will be passed by value to doIt()
std::cout << "main: x = " << x << " y = " << y << std::endl;
return 0;
}
还有另一种在C ++中传递参数的方法,它通过引用语义传递。它看起来像这样:
void doIt(int &z) //z is passed by reference, changing it will stick
//z is the SAME variable that was passed in, even if the name is different
{
z = 3; //this will change the value that was passed in
int y = 4;
std::cout << "doIt: z = " << x << " y = " << y << std::endl;
} //z is not destroyed here, because it wasnt created in this scope
int main()
{
int x = 1;
int y = 2;
std::cout << "main: x = " << x << " y = " << y << std::endl; //x is 1
doIt(x);
std::cout << "main: x = " << x << " y = " << y << std::endl; //x is 3 now
return 0;
}
按引用传递将“秘密”通过其内存地址发送变量,因此函数接收的int
实际上是传入的SAME。请注意,我选择了变量名称z,因为不同范围内变量的名称实际上并不重要。