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

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

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

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

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

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

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

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

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

Унарная форма записи:

:: Идентификатор

Бинарная форма записи:

ИмяКласса :: Идентификатор

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

#include <stdio.h>
int count=0; // (*)
void func(void) {
  for (int count=0; count<10; count++) {
    ++ :: count;  // увеличивает на 1 (*)
   }
}
int main() {
  printf("count = %d\n", count);
  func();
  printf("count = %d\n", count);
  getchar();
  return 0;
}

Результат выполнения
Область видимости
Бинарная форма используется для ссылки на контекст класса с целью устранения неоднозначности имен, которые могут повторно использоваться внутри класса.

class cl1 {void f() {...} ...};
class cl2 {void f() {...} ...};
cl1 :: f();  // обращение к f() из cl1
cl2 :: f();  // обращение к f() из cl2

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

Пример

#include <stdio.h>
char c;  // внешняя область (контекст)
class// внешнее объявление класса
{
  public:
    static char c;
    class// внутренне объявление класса
      {
       public:
           static char c;
           static void f(char key)  {
                   ::c=key;      // внешняя переменная
                   X::c = key+1; // переменная c класса X
                   c=key + 2;    // переменная c класса Y
                 }
     };
};
char X :: c = 0;
char X:: Y :: c = 0;
int main() {
  X::Y::f(3);
  printf("   c=%d\n", c);
  printf("X::c=%d\n", X::c);
  printf("Y::c=%d\n", X::Y::c);
  getchar();
  return 0;
}

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

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

Назад


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

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

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