Область видимости: локальная, глобальная, внутри класса

В языке С++ поддерживаются области видимости трех видов:

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

Также в область видимости файла входят классовые и локальные области видимости.

Области видимости, являющиеся частями блока, именуются локальными областями видимости. У всякой функции имеется соответствие обособленной некоторой области видимости. Функция может содержать в себе несколько блоков, содержимое которых ограничивается фигурными скобками {_}, более того, эти блоки формируют отдельные собственные области видимости. Область видимости для переменных в блоках размещается от начальной точки, до окончания блока.

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;
}

Результат работы программы.

Заключение.

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

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

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