НОУ ІНТУІТ, Лекція, Описи та константи
2.1 Описи
Ім'я (ідентифікатор) слід описати перш, ніж воно використовуватиметься у програмі на С++. Це означає, що потрібно вказати його тип, щоб транслятор знав, якого виду об'єктів належить ім'я. Нижче наведено кілька прикладів, що ілюструють усю різноманітність описів:
З цих прикладів видно, що роль описів не зводиться лише прив'язці типу до імені. Більшість зазначених описів є визначеннями, тобто. вони створюють об'єкт , який посилається ім'я. Для ch, count, name та cvar таким об'єктом є елемент пам'яті відповідного розміру. Цей елемент буде використовуватися як змінна , і кажуть, що йому відведена пам'ять . Для real подібним об'єктом буде задана функція. Для константи pi об'єктом буде число 3.1415926535897932385. Для комплексного об'єкта буде новий тип. Для point об'єктом є тип complex, тому point стає синонімом complex. Наступні описи вже не є визначеннями:
Це означає, що об'єкти, введені ними, повинні бути визначені в іншому місці програми. Тіло функції sqrt має бути вказане у якомусь іншому описі. Пам'ять для змінної error_number типу int повинна виділятися внаслідок іншого опису error_number . Має бути і якийсь інший опис типу user , з якого можна зрозуміти, що це за тип. У програмі мовою С++ має лише одне визначення кожного імені, але описів може бути багато. Однак всі описи повинні бути узгоджені за типом об'єкта, що вводиться в них. Тому у наведеному нижче фрагменті містяться дві помилки:
Натомість у наступному фрагменті немає жодної помилки (про використання extern):
У деяких описах зазначаються "значення" об'єктів, які вони визначають:
Для типів, функцій та констант " значення " залишається незмінним; для даних, які є константами, початкове значення може згодом змінюватися:
З усіх визначень тільки таке не задає значення:
Будь-який опис, який задає значення є визначенням.
2.1.1 Область видимості
Описом визначається область видимості імені. Це означає, що ім'я може використовуватись лише у певній частині тексту програми. Якщо ім'я описано у функції (зазвичай його називають "локальним ім'ям"), то область видимості імені тягнеться від точки опису до кінця блоку, в якому з'явився цей опис. Якщо ім'я не знаходиться в описі функції або класу (його зазвичай називають "глобальним ім'ям"), область видимості простягається від точки опису до кінця файлу, в якому з'явився цей опис. Опис імені в блоці може приховувати опис в блоці або глобальне ім'я; тобто. ім'я може бути перевизначено так, що воно позначатиме інший об'єкт усередині блоку. Після виходу із блоку колишнє значення імені (якщо воно було) відновлюється. Наведемо приклад:
У великих програмах уникнути перевизначення імен. На жаль, людина легко може переглянути таке перевизначення. Помилки, що виникають через це, знайти непросто, можливо тому, що вони досить рідкісні. Отже, перевизначення імен слід звести до мінімуму. Якщо ви позначаєте глобальні змінні або локальні змінні у великій функції такими іменами, як i або x, самі напрошуєтеся на неприємності.
Є можливість за допомогою операції дозволу області видимості :: звернутися до прихованого глобального імені, наприклад:
Можливість використання прихованого локального імені відсутня.
Область видимості імені починаєтьсяу точці його опису (після закінчення описувача, але ще до початку ініціалізатора). Це означає, що ім'я можна використовувати навіть до того, як встановлено його початкове значення. Наприклад:
Таке привласнення неприпустимо і не має сенсу. Якщо ви спробуєте транслювати цю програму, отримайте попередження: "використання до завдання значення". Разом про те, не застосовуючи оператора . можна використовувати те саме ім'я для позначення двох різних об'єктів блоку. Наприклад:
Змінна y ініціалізується значенням глобального x, тобто. 11, та був їй присвоюється значення локальної змінної x , тобто. 22. Імена формальних параметрів функції вважаються описаними у найбільшому блоці функції, тому в описі нижче є помилка:
Тут x визначено двічі на одній і тій же області видимості. Це хоч і не надто рідкісна, але досить тонка помилка.
2.1.3 Час життя об'єктів
Якщо програміст не втрутиться явно, об'єкт буде створений при появі його визначення і знищений, коли зникне з області видимості. Об'єкти з глобальними іменами створюються, ініціалізуються (причому лише один раз) та існують до кінця програми. Якщо локальні об'єкти описані зі службовим словом static , вони також існують остаточно програми. Ініціалізація їх відбувається, коли вперше управління "проходить через" опис цих об'єктів, наприклад:
Тут програма видасть такий результат:
З прикладів цієї лекції для стислості викладу виключено макрокоманда #include. Вона потрібна лише тих, які видають результат.
Операція "++" є інкрементом, тобто a++ означає: додати 1 до змінної a.
Глобальна змінна або локальна змінна static, яка не була явно ініціалізована, ініціалізується неявнонульовим значенням. Використовуючи операції new і delete програміст може створювати об'єкти, часом життя яких він управляє сам.