Урок №57. Стейтменти using

  Юрій  | 

  Оновл. 10 Тра 2020  | 

 94

Якщо ви часто використовуєте Стандартну бібліотеку C++, то постійне додавання std:: до використовуваних об’єктів може бути набридливим, чи не так? C++ надає альтернативу у вигляді стейтментів using.

Використання “оголошення using”

Однією з альтернатив є використання “оголошення using“. Ось програма «Hello, world!» з “оголошенням using” в рядку №5:

Рядок using std::cout; повідомляє компілятору, що ми будемо використовувати об’єкт cout з простору імен std. І кожен раз, коли компілятор буде стикатися з cout, він буде розуміти, що це std::cout.

Звичайно, в цьому випадку, ми не заощадили багато зусиль, але в програмі, де об’єкти з простору імен std використовуються сотні, якщо не тисячі разів, “оголошення using” непогано так економлять час, зусилля + покращують читабельність коду. Також для кожного об’єкту потрібно використовувати окреме “оголошення using” (наприклад, окреме для std::cout, окреме для std::cin і окреме для std::endl).

Хоча цей спосіб є менш привабливим, ніж використання префікса std::, він все ж є абсолютно безпечним і прийнятним.

Використання “директиви using”

Іншою альтернативою є використання “директиви using“. Ось програма «Hello, world!» з “директивою using” в рядку №5:

Багато розробників сперечаються щодо використання “директиви using”. Так як з її допомогою ми підключаємо ВСІ імена з простору імен std, то ймовірність виникнення конфліктів імен значно зростає (але все ж ця ймовірність в глобальному масштабі залишається незначною). using namespace std; повідомляє компілятору, що ми хочемо використовувати все, що знаходиться в просторі імен std, так що якщо компілятор знайде ім’я, яке не зможе розпізнати, він буде перевіряти його наявність в просторі імен std.

Порада: Намагайтеся уникати використання “директиви using” (наскільки це можливо).

Приклад конфлікту з “директивою using”

Розглянемо приклад, де використання “директиви using” створює невизначеність:

Тут компілятор не зможе зрозуміти, чи використовувати std::cout чи функцію cout(), яку ми визначили самі. В результаті отримаємо помилку неоднозначності. Хоч це і банальний приклад, але якби ми додали префікс std:: до cout:

Чи використовували би “оголошення using” замість “директиви using”:

Тоді наша програма була б без помилок.

Більшість програмістів уникають використання “директиви using” саме з цієї причини. Інші вважають це прийнятним доти, поки “директива using” використовується тільки в межах окремих функцій (що значно скорочує масштаби виникнення конфліктів імен).

Область видимості “оголошення using” і “директиви using”

Якщо “оголошення using” чи “директива using” використовуються в блоці, то вони застосовуються тільки всередині цього блоку (за звичайними правилами локальної області видимості). Це добре, оскільки зменшує масштаби виникнення конфліктів імен до окремих блоків. Однак багато початківців пишуть “директиву using” в глобальній області видимості (поза функцією main() або взагалі поза будь-яких функцій). Цим вони витягують всі імена з простору імен std безпосередньо в глобальну область видимості, значно збільшуючи ймовірність виникнення конфліктів імен. А це вже не добре.

Правило: Ніколи не використовуйте стейтменти using поза тілом функцій.

Відміна/заміна стейтментів using

Як тільки один стейтмент using був оголошений, його неможливо скасувати або замінити іншим стейтментом using в межах області видимості, в якій він був оголошений, наприклад:

Найкраще, що ви можете зробити — це навмисно обмежити область застосування стейтментів using з самого початку, використовуючи правила локальної області видимості:

Звичайно, весь цей головний біль можна було б уникнути, просто використавши оператор дозволу області видимості (::).

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (2 оцінок, середня: 5,00 з 5)
Loading...

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

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