可以调用C++中的全局变量吗?

Shr*_*rey -2 c++ variables syntax global

所以我正在查看一些旧的C++测试书,我发现其中一个问题的解决方案非常酷!我之前从未见过这种"语法",想问一下是否有人知道它是如何实际运作的,为什么它不被广泛传授!


问题: 将输出提供给以下代码 - >

int g =10; //TAKE NOTE OF THIS VARIABLE

void func(int &x, int y){
    x = x-y;
    y = x*10;
    cout << x << ',' << y << "\n";
}

void main(int argc, char** argv){
    int g = 7;    //Another NOTE
    func(::g,g); // <----- "::g" is different from "g"
    cout << g << ',' << ::g << "\n";

    func(g,::g);
    cout << g << ',' << ::g << "\n";
}
Run Code Online (Sandbox Code Playgroud)

输出:

3,30

7,3

4,30

4,3


我的问题是":: :(变量)"语法是如何工作的?它将变量存储在main之外,但存储在哪里(Stack/Heap)?我们可以通过指针更改"全局"变量的值吗?

我认为这可能允许一些非常酷的实现,并希望与像我这样的人分享这些知识:)

Mik*_*our 6

我的问题是":: :(变量)"语法是如何工作的?

::范围解析运算符.使用前面的类或命名空间的名称,这意味着它之后的名称是在该类或命名空间中的范围.在这里,没有任何东西,它意味着它之后的名称在全局命名空间中作用域; 也就是说,它在任何类,函数或命名空间之外声明.

通常,您可以在没有名称的情况下引用全局变量::.这里需要它,因为全局被具有相同名称的局部变量隐藏.这是避免全局变量的一个原因:如果添加隐藏它的声明,代码的含义可能会发生变化.

存储的内存在哪里(堆栈/堆)?

它位于静态存储中,既不在堆栈上也不在堆中.程序开始时分配存储,并持续到结束.

如果变量具有复杂类型,则可能在程序启动后的某个时间才初始化; 当您的代码在初始化之前使用它时,您可能会遇到模糊和痛苦的错误.这是避免全局变量的另一个原因.

我们可以通过指针更改"全局"变量的值吗?

是.你的例子就是这样,尽管有一个引用而不是一个指针.它也可以直接更改,例如::g = 42;,随时通过任何代码进行更改,因此很难推断包含它们的程序的状态.这是避免全局变量的另一个原因.

我认为这可能允许一些非常酷的实现

由于我在这里和其他人提到的原因,全局变量几乎总是比它们的价值更麻烦.如果我是你,我会避开它们.