Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsiyi_C_II_sem.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.52 Mб
Скачать

Зауваження до програми

Спочатку програма створює масив з трьох елементів по імені yams. Оскільки yams має три елементи, вони нумеруються від 0 до 2, і arrayone.срр використовує значення індексу від 0 до 2 для присвоювання значень трьом окремим елементам. Кожен індивідуальний елемент yams - це змінна типу int, з усіма правилами і привілеями типу int, тому arrayone.срр може (і робить це) присвоювати значення елементам, складати елементи, множити їх і відображати.

У цій програмі застосовується довгий спосіб присвоювання значень елементам yams. C++ також дозволяє ініціалізувати елементи масиву безпосередньо в операторі оголошення. У лістингу 1 демонструється цей скорочений спосіб при заданні значень елементів масиву yamcosts:

Він просто надає розділений комами список значень (список ініціалізації), вкладений у фігурні дужки. Пробіли в списку не обов'язкові. Якщо ви не ініціалізуєте масив, оголошений всередині функції, його елементи залишаються невизначеними. Це означає, що елементи отримують випадкові значення, які залежать від попереднього вмісту області пам'яті, виділеної для такого масиву.

Далі програма використовує значення масиву в декількох обчислення. Ця частина програми виглядає дещо безладно з усіма цими індексами та дужками. Цикл for надає потужний спосіб роботи з масивами і виключає необхідність явної вказівки індексів. Але поки ми обмежимося невеликими масивами.

Як ви, можливо, пам'ятаєте, операція sizeof повертає розмір в байтах типу або об'єкта даних. Зверніть увагу, що застосування sizeof до імені масиву дає кількість байт, займаних усім масивом. Проте використання sizeof відносно елемента масиву дає розмір в байтах одного елемента. Це ілюструє той факт, що yams - масив, але yams[1] - просто int.

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

У 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. Ці альтернативи є більш складними і гнучкими, ніж вбудований складовий тип масиву.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]