Область видимости

Язык C++ / Область видимости

 

С++ поддерживает три области видимости:

  • область видимости файла;
  • локальная область видимости;
  • область видимости класса.

Область видимости файла включает и локальную область видимости и область видимости класса.

Локальная область видимости – это область видимости внутри блока. Каждая функция – это отдельная область видимости. Внутри функции может быть несколько блоков, заключенных в фигурные скобки {…}, также образующих отдельные области видимости. Для переменных, объявленных в блоке, область видимости – от точки объявления до конца блока.

 
 
 
 
 
for (int i = 0; i<10; i++)
{
  тело цикла;
}
// переменная i недоступна

Каждый класс представляет отдельную область видимости. Имена членов класса локальны в этом классе. Область видимости членов класса (данных и функций) не зависит от точки их объявления, то есть член класса виден во всем классе. Каждая член-функция определяет свою собственную локальную область видимости, аналогично обычной функции. Можно явно указать область видимости в С++, используя оператор разрешения контекста (области видимости) ::.

Оператор разрешения контекста имеет самый высокий приоритет и применяется в двух формах:

  • унарная — ссылается на внешний контекст;
  • бинарная — ссылается на контекст класса.

Унарная форма записи:
:: Идентификатор
Бинарная форма записи:
ИмяКласса :: Идентификатор
Унарная форма используется для обращения к имени, относящемуся ко внешнему контексту и скрытому локальным контекстом или контекстом класса.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
int count = 0; // (*)
void func(void)
{
  for (int count = 0; count<10; count++) 
  {
    ++ ::count;  // увеличивает на 1 (*)
  }
}
int main() 
{
  cout << "count =" << ::count << endl;
  func();
  cout << "count =" << ::count << endl;
  cin.get();
  return 0;
}

Результат выполнения
Область видимости переменной

Бинарная форма используется для ссылки на контекст класса с целью устранения неоднозначности имен, которые могут повторно использоваться внутри класса.
1
2
3
4
class cl1 {void f() {…} …};
class cl2 {void f() {…} …};
cl1 :: f();  // обращение к f() из cl1
cl2 :: f();  // обращение к f() из cl2

Классы могут быть вложенными. Правила видимости для вложенных классов рассмотрим на примере.

Пример
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;
int c;  // внешняя область (контекст)
class X  // внешнее объявление класса
{
public:
  static int c;
  class Y  // внутренне объявление класса
  {
  public:
    static int c;
    static void f(int key)
    {
      ::c = key;      // внешняя переменная
      X::c = key + 1; // переменная c класса X
      c = key + 2;    // переменная c класса Y
    }
  };
};
int X::c = 0;
int X::Y::c = 0;
int main()
{
  X::Y::f(3);
  cout << "   c = " << c << endl;
  cout << "X::c = " << X::c << endl;
  cout << "Y::c = " << X::Y::c << endl;
  cin.get();
  return 0;
}

Результат выполнения
Область видимости

С++ дает возможность создавать вложенные функции-члены с использованием вложенных классов. Это ограниченная форма вложенности функций. Функции-члены должны определяться внутри локального класса, и на них нельзя ссылаться внутри этого контекста. Как и в Си, обычные вложенные функции запрещены. Вложенный класс не находится в области действия включающего его класса.


Назад: Язык C++

Комментариев к записи: 4

  • Николай
    Скажите, пожалуйста, зачем в примере об унарной форме обращения в функции main () используете оператор ввода: cin.get(); без него ничего не меняется. Спасибо.

    • Елена Вставская
      cin.get() нужен если программу запускать в консоли Windows. Без него консоль сразу закроется, и мы не увидим результат.

    • Дмитрий
      Подскажите, если в первом примере, при выводе, вместо "cout << ::count..." написать "cout << count", ведь тоже ничего не изменится?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *