Багатомірні масиви

У програмах на C++/CLI можна створювати масиви із двома й більше вимірами; максимальна кількість вимірів масиву - 32, чого цілком достатньо в більшості випадків. Кількість вимірів масиву вказується в кутових дужках відразу після типу елемента й відокремлюється від нього комі. За замовчуванням масив має один вимір, от чому ми не специфiрeвали його дотепер. От як можна створити двовимірний масив цiлочислених елементів:

array<int, 2>^ values = gcnew array<int, 2>(4, 5);

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

int nrows = 4; int ncols = 5;

array<int, 2>^ values = gcnew array<int, 2>(nrows, ncols);

for(int i = 0; i<nrows; i++)

for (int j =0; j<ncols; j++)

values [i,j] = (i+l)*(j+l);

Вкладений цикл проходить по всіх елементах масиву. Зовнішній цикл проходить по рядках, а внутрішній - по кожному елементі в поточному рядку. Значення кожного елемента встановлюється рівним значенню, отриманому в результаті обчислення вираження (i+l)*(j + l), тому елементи першого рядка будуть установлені в 1, 2, 3, 4, 5, другої рядка - 2, 4, 6, 8, 10 і так далі, аж до останнього рядка, елементи якої будуть рівні 4, 6, 12, 16, 20.

Нотація доступу до елементів двовимірного масиву відрізняється від нотації, використовуваної з масивами "рідного" C++. Це не випадково. Масив C++/CLI не є масивом, подібним до масивів рідного C++. Розмірність масиву називається його рангом (rank), тому ранг масиву values з попереднього приклада дорівнює 2. На відміну від цього, масиви рідного C++ у дійсності завжди мають ранг 1, оскільки рідні масиви C++ із двома й більше вимірами в дійсності є масивами масивів.

 

З раніше наведених прикладів було видно, що тип класу String, певний у просторі імен System, представляє рядок в C++/CLI (фактично рядка складаються їхніх символів Unicode). Виражаючись точніше, він представляє рядок, що складається з послідовності символів типу System::Char. Об'єкти класу String надають величезний обсяг потужної функціональності, що значно полегшує обробку рядків.

Об'єкт String можна створити в такий спосіб:

System::String^ saying = L"Приклад створення рядка";

Змінна saying - відслідковує дескриптор, що, що посилається на об'єкт String, iнiцiалiзований рядком, що перебуває праворуч від знака =. Необхідно завжди використати відслідковують дескриптори, що, для збереження посилань на об'єкти String. Представлений тут строковий лiтерал є рядком, що складається із широких символів, оскільки постачено префіксом L. Якщо пропустити префікс L, то одержимо строковий литерал, що складається з 8-бітових символів, а так компілятор гарантує, що він буде перетворений у рядок широких символів.

У програмі можна звертатися до індивідуальних символів у рядку, використовуючи нотацію масивів, і перший символ рядка має індекс 0. Наприклад, для висновку третього символу рядка saying, використаємо наступний оператор:

Console::WriteLine("Третій символ у рядку: {0}", saying[2]);

Однак, таким чином, тобто звертаючись до них по індексі, можна лише читати окремі символи рядка, обновляти рядок подібним чином не вдасться. Строкові об'єкти є незмінними (immutable), а тому не можуть бути модифіковані.