【问题标题】:Pass by reference and global variables通过引用和全局变量传递
【发布时间】:2021-05-27 08:25:45
【问题描述】:

我正在学习函数、引用和全局变量。 我有以下代码:

    #include <iostream>
    using namespace std;

    int x;
    void f(){ x = 2;}
    
    void g(int &x){ f(); }

    int main() {
        int x=5;
        g(x);
        cout<<x;
    }

为什么我没有得到 2 作为输出?由于 x 在 g() 内部发生变化,我希望该值会被保留。

【问题讨论】:

  • cout&lt;&lt;x; 正在打印出在main() 中定义的本地x。更改为cout&lt;&lt;::x; 打印出全局x
  • 因为f() 将全局x 更改为main(),而不是将本地更改为main(),并且main() 将本地更改为main()main() 通过引用将其本地 x 传递给 g() 的事实,或者 g() 的参数也被命名为 x 的事实并没有改变这一点。 g() 不会更改作为参数传递给它的值,因为它(和f())从不使用该参数。要从main() 打印全局x,请将本地x 重命名为其他名称,或打印::x

标签: c++ function reference global


【解决方案1】:

函数void f() 作用于全局 x。未使用传递给void g(int&amp;) 的参数。

全局xmain() 中定义的自动 x遮蔽

std::cout << "local " << x << " global " << ::x;

看看这两个变量会发生什么。

【讨论】:

  • 如果我写了 x=2;在 g() 函数中,我会在 main() 中得到该结果,我的问题是关于在 g() 中执行 f() 或分配 x=2; 之间的区别;在 g() 中
  • 如果您在g() 中写入了x = 2,那么main()x 的本地值将被更改。那是因为您通过引用将 x 传递给 g()
【解决方案2】:

如果我们在 C++ 中有一个同名的局部变量,我们可以使用范围解析运算符 (::) 访问一个全局变量

在你的主函数中你只需要使用cout&lt;&lt;::x;

为了更好的理解,请看下面的简单代码或者参考这个链接

How to access a global variable within a local scope?

#include <iostream>
using namespace std;
 
int x = 5;     // Global x 
int main()
{
    int x = 2; // Local x
    cout << "Value of global x is " << ::x << endl;
    cout << "Value of local x is " << x;
    getchar();
    return 0;
}

【讨论】:

    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多