Как получить доступ к глобальной переменной в локальной области?

Это мой код

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

Я получаю как вывод 1, но я хотел бы иметь 5, как при доступе к глобальной переменной x.

Возможно ли это?

Ответ 1

Вы должны использовать ::x для доступа к глобальной переменной в локальной области. Оператор :: является унарным оператором разрешения области. Поэтому ваш код должен быть:

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

Примечание: оператор :: имеет два значения в С++:

  • Оператор разрешения двоичной области.
  • Оператор разрешения Unary Scope.

Почти за все время кодирования вы будете использовать оператор разрешения двоичной области. Поэтому, хотя ответ на этот вопрос является унарным оператором разрешения масштаба; как раз для будущей ссылки, я завожу некоторые типичные варианты использования оператора разрешения двоичной области.

Использовать случаи оператора разрешения двоичной области:

1. Чтобы определить свои функции вне класса.

Мы организуем наш код в заголовочные файлы с расширением .h и файлами кода с расширением .cpp. При определении наших функций в файлах кода мы используем оператор :: Binary scope resolution.

Например, файл 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.
}

Здесь, как легко заметить, :: действует на два операнда:

  • Имя класса
  • Имя функции

Следовательно, он по существу определяет область действия функции, то есть она сообщает компилятору, что функция drive() принадлежит классу 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 drive method.  
    b.Vehicle::drive();  // Will call Vehicle drive method.
}

Поскольку обе производные функции класса BMW имеют один и тот же шаблон, вызов b.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 drive function.
    b.Car::drive(); // Will call Car 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;
}