Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Правила ініціалізації масивів



У C++ існує кілька правил, що стосуються ініціалізації масивів. Вони обмежують, коли ви можете її здійснювати, і визначають, що трапиться, якщо кількість елементів масиву не відповідає кількості елементів ініціалізатора. Давайте розглянемо ці правила.

Ви можете використовувати ініціалізацію тільки при оголошенні масиву. Її не можна виконати пізніше, і не можна присвоювати один масив іншому:

Однак можна використовувати індекси і присвоювати значення елементів масиву індивідуально.

При ініціалізації масиву можна вказувати менше значень, ніж у масиві оголошено елементів. Наприклад, наступний оператор ініціалізує тільки перші два елементи масиву hotelTips:

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

Слід зазначити, що у разі ініціалізації масиву із застосуванням {1} замість {0} тільки перший елемент буде встановлено в 1; інші як і раніше отримають значення 0.

Якщо при ініціалізації масиву залишити квадратні дужки порожніми, то компілятор C++ самостійно перерахує елементи. Припустимо, наприклад, що є таке оголошення:

Компілятор зробить things масивом чотирьох елементів.

Чи дозволяти компілятору самому підраховувати елементи

Часто компілятор при підрахунку елементів одержує не ту кількість, яку, як ви очікуєте, повинна бути. Причиною може бути, наприклад, ненавмисний пропуск одного або декількох значень у списку ініціалізації. Однак, як ви незабаром переконаєтеся, такий підхід може бути цілком безпечним для ініціалізації символьного масиву рядком. І якщо головна мета полягає в тому, щоб програма, а не ви, знала розмір масиву, то можна записати приблизно наступний код:

Зручно це чи ні - залежить від обставин, що склалися.

Ініціалізація масивів у С++ 11

Як згадувалося раніше (у першому семестрі), в C++ 11 форма ініціалізації з фігурними дужками (спискова ініціалізація) стала універсальною для всіх типів. Масиви вже використовують спискову ініціалізацію, але у версії С++ 11 з'явилися додаткові можливості.

По-перше, при ініціалізації масиву можна відкинути знак “=”:

По-друге, можна використовувати порожні фігурні дужки для задання всіх елементів в 0:

По-третє, як обговорювалося раніше, спискова ініціалізація захищає від звуження:

Перша ініціалізація не допускається, тому перетворення з типу з плаваючою точкою в цілочисельний тип є звуженням, навіть якщо значення з плаваючою точкою містить після десяткової точки лише нулі. Друга ініціалізація не допускається, оскільки 1122011 виходить за межі діапазону значень типу char, припускаючи, що char займає 8 біт. Третя ініціалізація виконується успішно, тому незважаючи на те, що 112 значення int, воно знаходиться в рамках діапазону типу char.

Стандартна бібліотека шаблонів C++ (STL) пропонує альтернативу масивам - шаблонний клас vector, а в С++ 11 ще доданий шаблонний клас array. Ці альтернативи є більш складними і гнучкими, ніж вбудований складовий тип масиву.


Лекція 2

Рядки

Рядок - це серія символів, збережена в розташованих послідовно байтах пам'яті. У C++ доступні два способи роботи з рядками. Перший, успадкований від С і часто званий рядками в стилі С. Альтернативний спосіб, заснований на бібліотечному класі string.

Ідея серії символів, що зберігаються в послідовних байтах, припускає зберігання рядка в масиві char, де кожен елемент міститься в окремому елементі масиву. Рядки надають зручний спосіб зберігання текстової інформації, такої як повідомлення для користувача або його відповіді. Рядки в стилі С володіють спеціальною характеристикою: останнім у кожній такій рядку є нульовий символ. Цей символ, записується як «\0», є символом з ASCII-кодом 0, який служить міткою кінця рядка. Наприклад, розглянемо два наступних оголошення:

Обидві ці змінні є масивами char, але тільки другий з них є рядком. Нульовий символ грає фундаментальну роль в рядках стилю С. Наприклад, в C++ є безліч функцій для обробки рядків, включаючи ті, що використовуються cout. Всі вони обробляють рядки символ за символом доти, поки не зустрінеться нульовий символ. Якщо ви просите об'єкт cout відобразити такий рядок, як cat з попереднього прикладу, він виводить перших сім символів, виявляє нульовий символ і на цьому зупиняється. Однак якщо ви раптом вирішите вивести в cout масив dog з попереднього прикладу, який не є рядком, то cout надрукує вісім символів з цього масиву і продовжуватиме рухатися по пам'яті, байт за байтом, інтерпретуючи кожен з них як символ, що підлягає висновку, поки не зустріне нульовий символ. Оскільки нульові символи, які, по суті, являють собою байти, що містять нулі, зустрічаються в пам'яті досить часто, помилка зазвичай виявляється швидко, але в будь-якому випадку ви не повинні трактувати нерядкові символьні масиви як рядки.

Приклад ініціалізації масиву cat виглядає досить громіздким і виснажливим - безліч лапок і необхідність пам'ятати про нульовий символі. Існує більш простий спосіб ініціалізації масиву за допомогою рядка. Для цього просто використовуйте рядок в подвійних лапках, який називається «рядковою константою» або «рядковим літералом»:

Рядки в подвійних лапках завжди неявно включають обмежуючий нульовий символ, тому вказувати його не потрібно (Мал. 2.). До того ж різноманітні засоби введення C++, призначені для читання рядка з клавіатурного введення в масив char, автоматично додають завершальний нульовий символ. (Якщо при компіляції програми з лістингу 1 виникне необхідність у використанні ключового слова static для ініціалізації масиву, це також знадобиться зробити з показаними вище масивами char.)

Мал. 2. Ініціалізація масива рядком

Звичайно, ви повинні забезпечити достатній розмір масиву, щоб в нього помістилися всі символи рядка, включаючи нульовий. Ініціалізація символьного масиву рядковою константою - це один з тих випадків, коли безпечніше доручити компілятору підрахунок кількості елементів в масиві. Якщо зробити масив більше рядка, ніяких проблем не виникне - тільки непродуктивна витрата простору. Причина в тому, що функції, які працюють з рядками, керуються позицією нульового символу, а не розміром масиву. У C++ не накладається ніяких обмежень на довжину рядка.

Зверніть увагу, що рядкова константа (в подвійних лапках) не взаємозамінна з символьної константою (в одинарних лапках). Символьна константа, така як 'S' - скорочене позначення для коду символу. В системі ASCII константа 'S' - це просто інший спосіб запису коду 83. Тому наступний оператор привласнює значення 83 змінній shirt_size:

З іншого боку, "S" не є символьної константою; це рядок, що складається з двох символів - S і \0. Гірше того, "S" в дійсності представляє адреса пам'яті, по якому розміщується рядок. Це означає, що оператор

означає спробу привласнити адресу пам'яті змінній shirt_size:

Оскільки адреса пам'яті - це окремий тип в C++, компілятор не пропустить подібну нісенітницю.




©2015 studopedya.ru Все права принадлежат авторам размещенных материалов.