С++ поддерживает три области видимости:
- область видимости файла;
- локальная область видимости;
- область видимости класса.
Область видимости файла включает и локальную область видимости и область видимости класса.
Локальная область видимости – это область видимости внутри блока. Каждая функция – это отдельная область видимости. Внутри функции может быть несколько блоков, заключенных в фигурные скобки {…}, также образующих отдельные области видимости. Для переменных, объявленных в блоке, область видимости – от точки объявления до конца блока.
{
тело цикла;
}
// переменная i недоступна
Каждый класс представляет отдельную область видимости. Имена членов класса локальны в этом классе. Область видимости членов класса (данных и функций) не зависит от точки их объявления, то есть член класса виден во всем классе. Каждая член-функция определяет свою собственную локальную область видимости, аналогично обычной функции. Можно явно указать область видимости в С++, используя оператор разрешения контекста (области видимости) ::.
Оператор разрешения контекста имеет самый высокий приоритет и применяется в двух формах:
- унарная — ссылается на внешний контекст;
- бинарная — ссылается на контекст класса.
Унарная форма записи:
:: Идентификатор
Бинарная форма записи:
ИмяКласса :: Идентификатор
Унарная форма используется для обращения к имени, относящемуся ко внешнему контексту и скрытому локальным контекстом или контекстом класса.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;
}
Результат выполнения

Бинарная форма используется для ссылки на контекст класса с целью устранения неоднозначности имен, которые могут повторно использоваться внутри класса.
2
3
4
class cl2 {void f() {…} …};
cl1 :: f(); // обращение к f() из cl1
cl2 :: f(); // обращение к f() из cl2
Классы могут быть вложенными. Правила видимости для вложенных классов рассмотрим на примере.
Пример
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
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