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

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

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

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

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

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

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

Заключение.

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

Добавление комментария

Ваше Имя:
Ваш E-Mail:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Вставка исходного кода Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера

Код:
Включите эту картинку для отображения кода безопасности
обновить, если не виден код
Введите код: