如何在本地范围内访问全局变量?

时间:2013-12-08 20:35:55

标签: c++ global-variables local

这是我的代码

#include <iostream>
using namespace std;
int x = 5;
int main()
{
    int x = 1;
    cout << "The variable x: " << x << endl;
}   

我得到输出1,但我希望5,就像访问全局x变量一样。

这可能吗?

1 个答案:

答案 0 :(得分:31)

您应该使用::x来访问本地范围内的全局变量。运算符::是一元范围解析运算符。所以你的代码应该是:

   #include <iostream>
   using namespace std;
   int x = 5;
   int main()
   {
       int x = 1;
       cout << "The variable x: " << ::x << endl;
   }   

注意:::运算符在C ++中有两个含义:

  1. 二进制范围解析运算符。
  2. 一元范围解析运算符。
  3. 几乎在整个编码时间内,您将使用二进制范围解析运算符。所以虽然这个问题的答案是一元范围解析算子;为了便于将来参考,我列出了二进制范围解析运算符的一些典型用例。

    二进制范围解析运算符的用例:

    <强> 1。在课堂外定义你的功能。

    我们将代码组织成带有 .h 扩展名的头文件和带有 .cpp 扩展名的代码文件。在代码文件中定义函数时,我们使用::二进制范围解析运算符。

    例如, Car.h 文件如下所示:

    class Car
    {
        private:
            int model;
            int price;
    
        public:
            void drive();
            void accelerate();
    };
    

    Car.cpp 看起来像:

    void Car :: drive()
    {
        // Driving logic.
    }
    void Car :: accelerate()
    {
        // Logic for accelerating.
    }
    

    在这里,我们可以很容易地注意到,::对两个操作数起作用:

    1. 班级名称
    2. 功能名称
    3. 因此,它实质上定义了函数的范围,即它通知编译器函数 drive() 属于 class Car。


      <强> 2。解决具有相同模板的两个函数之间的歧义,这些函数派生自不同的类。

      请考虑以下代码:

      #include <iostream>
      using namespace std;
      class Vehicle
      {
          public:
          void drive()
          {
              cout << "I am driving a Vehicle.\n";
          }
      };
      class Car
      {
          public:
          void drive()
          {
              cout << "I am driving a Car.\n";
          }
      };
      class BMW : public Car, public Vehicle
      {
          // BMW specific functions.
      };
      int main(int arc, char **argv)
      {
          BMW b;
          b.drive();  // This will give compile error as the call is ambiguous.
          b.Car::drive();  // Will call Car's drive method.  
          b.Vehicle::drive();  // Will call Vehicle's drive method.
      }
      

      由于BMW类的派生函数都具有相同的模板,因此调用b.drive将导致编译错误。因此,要指定我们想要的 drive(),我们使用::运算符。


      第3。覆盖被覆盖的函数。

      二进制范围解析运算符有助于调用基类的函数,该函数使用派生类的对象在派生类中重写。请参阅以下代码:

      #include <iostream>
      using namespace std;
      class Car
      {
          public:
          void drive()
          {
              cout << "I am driving Car.\n";
          }
      };
      class BMW : public Car
      {
          public:
          void drive()
          {
              cout << "I am driving BMW\n";
          }
      };
      int main(int argc, char** argv)
      {
          BMW b;
          b.drive(); // Will call BMW's drive function.
          b.Car::drive(); // Will call Car's drive function.
      }
      

      <强> 4。访问静态数据成员。

      正如我们所知,静态数据成员是由该类的对象按类共享的。因此,我们不应该(尽管我们可以)使用对象来定义静态变量。请参阅以下代码:

      #include <iostream>
      using namespace std;
      class Car
      {
          public:
          static int car_variable;
      };
      int Car :: car_variable;
      int main(int argc, char** argv)
      {
          Car :: car_variable = 10;
          cout << "Car variable: " << Car :: car_variable << '\n';
          return 0;
      }