Урок №52. Связи, область видимости и продолжительность

  Юрий  | 

  Обновл. 17 Апр 2019  | 

 11975

Мы уже рассматривали в разных уроках область видимости, продолжительность, связи и то, какими они могут быть. Сейчас пора всё это закрепить в одном уроке.

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

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

   Переменные с локальной/блочной областью видимости доступны только в пределах блока, в котором они объявлены. Это:

   локальные переменные;

   параметры функции.

   Переменные с глобальной/файловой областью видимости доступны в любом месте файла. Это:

   глобальные переменные.

Продолжительность


Продолжительность переменной определяет, где она создаётся и где уничтожается.

   Переменные с автоматической продолжительностью создаются в точке определения и уничтожаются при выходе из блока, в котором определены. Это:

   обычные локальные переменные.

   Переменные со статической продолжительностью создаются, когда программа запускается, и уничтожаются при её завершении. Это:

   глобальные переменные;

   статические локальные переменные.

   Переменные с динамической продолжительностью создаются и уничтожаются по запросу программиста. Это:

   динамические переменные (о них мы поговорим в главе №6).

Связи

Связь идентификатора определяет, относятся ли несколько упоминаний одного идентификатора к одному и тому же идентификатору или нет.

   Идентификаторы без связей — это идентификаторы, которые ссылаются сами на себя. Это:

   обычные локальные переменные;

   пользовательские типы данных, такие как enum, typedef и классы, объявленные внутри блока (об этом детальнее поговорим в соответствующих уроках).

   Идентификаторы с внутренней связью доступны в любом месте файла, в котором они объявлены. Это:

   статические глобальные переменные (инициализированные или неинициализированные);

   константные глобальные переменные;

   статические функции (о них поговорим в главе №7).

   Идентификаторы с внешней связью доступны как в любом месте файла, в котором они объявлены, так и в других файлах (через предварительное объявление). Это:

   обычные функции;

   неконстантные глобальные переменные (инициализированные или неинициализированные);

   внешние константные глобальные переменные;

   определяемые пользователем типы данных, такие как enum, typedef и классы с глобальной областью видимости (о них поговорим позже).

Идентификаторы с внешней связью могут вызывать ошибку дублирования определений, если определения будут скомпилированы в более чем один файл .cpp.

Функции имеют внешнюю связь по умолчанию, что можно изменить с помощью ключевого слова static (на внутреннюю связь).

Внимательные читатели могут заметить, что глобальные типы данных имеют внешнюю связь, но их определения не вызывают ошибки линкера при использовании в нескольких файлах. Это связано с тем, что типы, шаблоны и внешние встроенные функции имеют освобождение, которое позволяет им быть определёнными более чем в одном файле, при условии, что эти определения идентичны. В противном случае, они не были бы так полезны.

Резюмируем


Весь материал выше:

Тип Пример Область видимости Продолжительность Связь Примечание
Локальная переменная int x; Локальная области видимости Автоматическая продолжительность Нет связей
Статическая локальная переменная static int s_x; Локальная области видимости Статическая продолжительность Нет связей
Динамическая переменная int *x = new int; Локальная области видимости Динамическая продолжительность Нет связей
Параметр функции void foo(int x) Локальная области видимости Автоматическая продолжительность Нет связей
Внешняя неконстантная глобальная переменная int g_x; Глобальная область видимости Статическая продолжительность Внешняя связь Инициализированная или неинициализированная
Внутренняя неконстантная глобальная переменная static int g_x; Глобальная область видимости Статическая продолжительность Внутренняя связь Инициализированная или неинициализированная
Внутренняя константная глобальная переменная const int g_x(1); Глобальная область видимости Статическая продолжительность Внутренняя связь Должна быть инициализирована
Внешняя константная глобальная переменная extern const int g_x(1); Глобальная область видимости Статическая продолжительность Внешняя связь Должна быть инициализирована

Предварительные объявления

С помощью предварительного объявления мы можем получить доступ к функции или переменной из другого файла:

Тип Пример Примечание
Предварительное объявление функции void foo(int x); Только прототип, без тела функции
Предварительное объявление неконстантной глобальной переменной extern int g_x; Должно быть инициализировано
Предварительное объявление константной глобальной переменной extern const int g_x; Должно быть инициализировано

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (140 оценок, среднее: 4,90 из 5)
Загрузка...

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

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

telegram канал
НОВОСТИ RAVESLI