Our Blog

Назначение операции разрешения области действия

Довольно часто при программировании на C++ мы используем эту операцию. Операция разрешения области действия обозначается двумя символами двоеточие без пробела – “::” Узнали? Рассмотрим ее назначение.

Она бывает двух типов: унарная и бинарная.
Унарная операция разрешения области действия позволяет получить доступ к глобальной переменной (область видимости – вся программа) из блока, в котором может быть объявлена локальная переменная (область видимости начинается ее объявлением и заканчивается закрытием текущего блока) с таким же именем.
Пример:

1.int a; //глобальная переменная
2.void func1(){
3.int a; //локальная переменная
4.a=10; //обращение к локальной переменной
5.::a=100; //обращение к глобальной переменной
6.}

Бинарная операция разрешения области действия позволяет ссылаться на элемент класса при наличии одноименных переменных или функций, объявленных вне его или в нескольких классах. Также данная операция используется при описании функции-метода вне класса.
Операция разрешения области действия используется в следующих случаях:

1) Локальная переменная, объявленная в теле функции, имеет то же имя, что и некая глобальная переменная. По умолчанию компилятор считает, что все упоминания этого имени в теле функции относятся к локальной переменной, а доступ к глобальной переменной осуществляется через операцию :: (унарную)
Пример:

01.<...>
02.int var = 0;
03.int main()
04.{
05.int var = 1;
06.cout << var; // 1
07.cout << ::var; // 0
08.return 0;
09.}

2) Имя в пространстве имен не разрешено оператором using.
Пример:

1.<...>
2.//нет using namespace std;
3.int main()
4.{
5.std::cout << "Hello world" << std::endl;
6.return 0;
7.}

3) Для доступа к статическим свойствам и методам классов.
Пример:

01.<...>
02.class MyClass
03.{
04.public:
05.<...>
06.static int a;
07.};
08. 
09.int main()
10.{
11.int MyClass::a = 1;
12.MyClass c;
13.cout << c.a; // 1
14.return 0;
15.}

4) Если метод класса реализован вне его определения.
Пример:

01.MyClass.h
02.<...>
03.class MyClass
04.{
05.public:
06.MyClass();
07.~MyClass();
08.}
09. 
10.MyClass.cpp
11.<...>
12.MyClass::MyClass()
13.{
14.<...>
15.}
Comments ( 0 )
    -->