Урок №55. Зв’язки, область видимості та тривалість життя

  Юрій  | 

  Оновл. 4 Вер 2021  | 

 275

Ми вже раніше розглядали, що таке область видимості, тривалість життя, зв’язки і те, якими вони можуть бути в мові С++. Давайте зараз закріпимо це все.

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

Область видимості ідентифікатора визначає, де він доступний для використання. До ідентифікатора, який знаходиться поза областю видимості, доступ закритий.

   Змінні з локальною областю видимості доступні тільки в межах блоку, в якому вони оголошені. Це:

   локальні змінні;

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

   Змінні з глобальною/файловою областю видимості доступні в будь-якому місці файлу. Це:

   глобальні змінні.

Тривалість життя

Тривалість життя змінної визначає, де вона створюється і де знищується.

   Змінні з автоматичною тривалістю життя створюються в точці визначення і знищуються при виході з блоку, в якому вони визначені. Це:

   звичайні локальні змінні.

   Змінні зі статичною тривалістю життя створюються, коли програма запускається, і знищуються при її завершенні. Це:

   глобальні змінні;

   статичні локальні змінні.

   Змінні з динамічною тривалістю життя створюються і знищуються по запиту програміста. Це:

   динамічні змінні.

Зв’язки

Зв’язок ідентифікатора визначає, чи належать декілька згадок одного ідентифікатора до одного і того ж ідентифікатора чи ні.

   Ідентифікатори без зв’язку — це ідентифікатори, які посилаються самі на себе. Це:

   звичайні локальні змінні;

   користувацькі типи даних, такі як enum, typedef і класи, оголошені всередині блоку (про це детально поговоримо на відповідних уроках).

   Ідентифікатори з внутрішнім зв’язком доступні в будь-якому місці файла, в якому вони оголошені. Це:

   статичні глобальні змінні (ініціалізовані чи неініціалізовані);

   константні глобальні змінні;

   статичні функції (про них ми поговоримо пізніше).

   Ідентифікатори з зовнішнім зв’язком доступні як в будь-якому місці файлу, в якому вони оголошені, так і в інших файлах (через попередні оголошення). Це:

   звичайні функції;

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

   зовнішні константні глобальні змінні;

   користувацькі типи даних, такі як 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 Зірок (6 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

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