В языке С++ поддерживаются области видимости трех видов:
- локальная область видимости;
- файловая область видимости;
- область видимости класса.
Также в область видимости файла входят классовые и локальные области видимости.
Области видимости, являющиеся частями блока, именуются локальными областями видимости. У всякой функции имеется соответствие обособленной некоторой области видимости. Функция может содержать в себе несколько блоков, содержимое которых ограничивается фигурными скобками {_}, более того, эти блоки формируют отдельные собственные области видимости. Область видимости для переменных в блоках размещается от начальной точки, до окончания блока.
for (int i = 0; i<10; i++)
{
тело цикла;
}
// переменная i недоступна
В каждом классе представлена особая область видимости. В этих классах имена членов класса представлены локально. Член класса является видимым во всём классе, то есть, его область видимости не зависит от места, в котором его объявили. Любая член-функция самостоятельно определяет свою локальную область видимости, подобно стандартному виду функции. То есть, можно без труда описать область видимости в С++, пользуясь оператором разрешения контекста.
Данный оператор обладает самой высокой приоритетностью и обычно используется в таких видах:
- унарная, то есть, опирается на внешний контекст;
- бинарная, то есть, опирается на контекст класса.
Описание в унарном виде:
:: Идентификатор
Описание в бинарном виде:
ИмяКласса :: Идентификатор
При обращении к имени, принадлежащему окружающему контексту и скрытому локальным или классовым контекстом, прибегают к использованию унарной формы.
#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;
}
Результат работы программы.
В случае, когда необходимо сослаться на контекст класса для установления однозначности имён, которые могут подвергаться многочисленным повторениям, применяется бинарная форма.
class cl1 {void f() {…} …};
class cl2 {void f() {…} …};
cl1 :: f(); // обращение к f() из cl1
cl2 :: f(); // обращение к f() из cl2
Классы могут считаться вложенными. Рассмотрим на примере алгоритм фиксирования видимости вложенных классов.
Пример:
#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;
}
Результат работы программы.
Заключение.
В языке программирования С++ допустимо создание вложенных функций-членов, используя вложенные классы — это так называемая форма вложенности функций с определёнными ограничениями. Для правильной работы требуется определение функций-членов в конкретном локальном классе, ссылаться на них внутри этого контекста запрещено. Так же, как и в языке С, использование обычных вложенный функций невозможно, так как этот класс функций не размещается в области действия класса, который его включает.