(初学者模式)调用时的变量属性

时间:2015-12-21 19:54:27

标签: c++

所以我开始学习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,是否会出现错误?这是否意味着该函数需要一个整数变量而不是一个独立的整数?这个程序旨在展示这些变量是如何局部的,但我不确定它们是如何组合在一起的。

4 个答案:

答案 0 :(得分:0)

变量不会传递给函数 - 值是。 (如果我们说&#34;变量被传递给函数&#34;,它只是说变量的被传递给函数)

doIt被调用时,x中的ydoIt全新变量,与main 。第一个参数的值(x中的main的值,即1)存储在x中。然后,3存储在x中(由行x = 3;)。然后,4存储在y中。然后打印xy,其中包含值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,因为不同范围内变量的名称实际上并不重要。