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

   ⁄ 

 Обновлено 17 Апр 2017

  ⁄   

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

Область видимости. Главное

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

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

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

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

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

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

Продолжительность. Главное

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

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

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

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

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

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

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

  динамические переменные (о них мы поговорим в главе 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 (8 оценок, среднее: 4,75 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

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

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