Ви вже познайомилися з першою статтею по темі Локальні і глобальні змінні. Область видимості в С ++. Хотелось бы ещё немного дополнить её. А именно примером с пространствами имен. Я не дарма писав префікс std:: перед оператором виведення cout. і endl. Це теж одна з формацій області видимості – простір імен. Якщо не вдаватися в особливі подробиці, простір імен, це якась група операторів / функций / переменных / типів, об'єднана в таку собі “фракцію” з ім'ям std.
std це простір імен з заголовки (хедера на нашу) iostream. cout, cin, endl та ін. – це все “династія” std. Якщо не підключити його в коді і не написати std:: перед цими операторами, С ++ скаже “давай до побачення”. Тому що він не в курсі, що це за cout такий без “прізвища”. До речі в С ++ і придуманий оператор використовуючи простір імен, який дозволяє не писати ім'я простору в якості префікса до кожного відвідувача в нього оператору . Це для зручності зроблено, але потрібно з цим оператором бути акуратніше, якщо є однойменні функції використовуються в програмі з різних просторів імен.
Простір імен добре там, де потрібно згрупувати щось в область видимості на ім'я. Наприклад в програмі можуть бути описані дві різні функції sum(). Одна повертає ціле, друга речовий. Якщо за завданням їх не можна описувати як перевантажені, то можна вкрутити їх в простір імен:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <iostream> int i = 2; namespace integer { int sum() { int k = 2; return i + k; } } namespace floating { float sum() { float k = 2.5; return k + i; } } int main() { std::cout << integer::sum() << std::endl; std::cout << floating::sum() << std::endl; } |
Простір імен тут визначає зону видимості для різних функцій з однаковим ім'ям. За межами простору імен цих функцій не існує.
Взагалі простір імен може стати спірним моментом щодо теорії області видимості. По факту це просто угруповання на ім'я, але діє вона так само, як і блок операторів {…}. Хочеш звернутися до операторів з цього простору – будь добрий звернися спочатку до імені простору: ціле число :: sum() Tut товстої кишки :: – це оператор розширення області видимості.
мабуть останнім, що можна сказати – область видимості дуже показова в ООП (об'єктно орієнтоване програмування). Коли в класі програміст описує private властивість (змінні чи функції-метод), він задає їй область видимості. Наприклад в коді типу:
1 2 3 4 5 6 7 8 9 10 | class C { private: int k; public: int kc; int sum() { return k + kc; } }; |
властивості k і кілогерц мають різні області видимості. Перша доступна тільки всередині методів класу. До неї не можна звернутися в основній програмі, вона приватна (private ). Закрита для всіх, крім області видимості самого класу.
друга публічна (public). Її область видимості виходить за межі класу. з програми, де буде викликатися об'єкт цього класу вона доступна.
кілогерц оголошена як публічна змінна, її область видимості на відміну від зміною k , ширше. Тому компілятор проти її використання поза межами класу.
Який можна зробити з усього цього висновок? Гіки з піною у рота кричать на всіх порталах – “геть глобальні змінні!”. Гікам подобається обмежувати область видимість, локализуя і упаковуючи все в класи або простору імен. Гіки є гіки. Програміст не повинен зловживати областю видимості, інакше вийде, надання, коли щоб звернутися до змінної потрібно писати її шлях. Тобто,. щось типу моє ім'я::group1::PeremenkiDlaPrepoda::i Ну жесть просто.
Використання глобальних змінних поряд з локальними має бути з розумом – там де це доцільно писати глобальну. Там де немає – локалізувати.
Якщо ви не дивилися відео по темі Область видимості в С ++ в попередньому уроці – розміщуємо його і тут:
r5av7s