67280

Перевантаження оператора «[]»

Лекция

Информатика, кибернетика и программирование

На додаток до традиційних перевантажених операторів мова програмування C++ дає змогу перевантажувати і оператор індексації елементів масиву "[]". У мові програмування C++ (з погляду механізму перевантаження) оператор "[]" вважається бінарним.

Украинкский

2014-09-06

49 KB

1 чел.

Лекція № 12

Тема: Перевантаження оператора "[]"

   На додаток до традиційних перевантажених операторів мова програмування C++ дає змогу перевантажувати і оператор індексації елементів масиву "[]". У мові програмування C++ (з погляду механізму перевантаження) оператор "[]" вважається бінарним. Його можна перевантажувати тільки для класу і тільки з використанням функції-члена класу. Ось як виглядає загальний формат операторної функції-члена класу operator[]().

тип ім'я_класу::operator[](int індекс)

{

//...

}

    Формально параметр індекс необов'язково повинен мати тип int, але операторна функція operator[]() зазвичай використовують для забезпечення індексації елементів масивів, тому в загальному випадку як аргумент цієї функції передається цілочисельне значення.

    Припустимо, нехай створено об'єкт ObjA, тоді вираз ObjA[3] перетвориться в такий виклик операторної функції operator[]():

ObjA.operator[](3);

Іншими словами, значення виразу, що задається в операторі індексації елементів масиву "[]", передається операторній функції operator[]() як безпосередньо заданий аргумент. При цьому показник this вказуватиме на об'єкт ObjA, тобто об'єкт, який здійснює виклик цієї функції.

    У наведеному нижче коді програми в класі aClass оголошується масив для зберігання трьох int-значень. Його конструктор ініціалізує кожного члена цього масиву. Перевантажена операторна функція operator[]() повертає значення елемента, що задається його параметром.

Приклад1.  Демонстрація механізму перевантаження оператора індексації елементів

                   масиву "[]"

const int size = 3;

class aClass

{

int aMas[size];

public:

aClass() { for(int i=0; i<size; i++) aMas[i] = i*i; }

int operator[](int i) {return aMas[i]; }

};

void main()

{

aClass ObjA;

cout << "aMas[2]= " << ObjA[2] << endl;                   // Відображає число 4

cout << "Znachennja elementiv mas <A>:" << endl;

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

 cout << "aMas[" << i << "]= " << ObjA[i] << endl;

}

   Внаслідок виконання ця програма відображає на екрані такі результати:

a[2]= 4

Значення елементів масиву <A>:

a[0]= 0

a[1]= 1

a[2]= 4

 

   Ініціалізація масиву aMas за допомогою конструктора (у цій і наступній програмах) здійснюється тільки з ілюстративною метою. У цьому коді програми функція operator[]() спочатку повертає значення 3-го елемента масиву aMas. Таким чином, вираз ObjA[2] повертає число 4, яке відображається настановою cout. Потім у иклі виводяться усі елементи масиву.

   Можна розробити операторну функцію operator[]() так, щоб оператор індексації елементів масиву "[]" можна було використовувати як зліва, так і праворуч від оператора присвоєння. Для цього достатньо вказати, що значення, що повертається операторною функцією operator[](), є посиланням. Цю можливість продемонстровано у наведеному нижче коді програми.

Приклад2.  Демонстрація механізму перевантаження оператора індексації елементів

                   масиву "[]" як зліва, так і праворуч від оператора присвоєння

const int size = 3;

 

class aClass

{

 int aMas[size];

public:

aClass() { for(int i=0; i<size; i++) aMas[i] = i*i; }

 int &operator[](int i) {return aMas[i]; }

};

 

int main()

{

  aClass ObjA;

  cout << "Znachennja elementiv mas <A>:" << endl;

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

 cout << "aMas[" << i << "]= " << ObjA[i] << endl;

 

  ObjA[2] = 25;       // Оператор "[]" знаходиться зліва від оператора

                            присвоєння "=".

 cout << endl << "aMas[2]= " << ObjA[2]; // Тепер відображається число 25.

}

   Внаслідок виконання ця програма відображає на екрані такі результати:

Значення елементів масиву <A>:

a[0]= 0

a[1]= 1

a[2]= 4

 

a[2]= 25

    Оскільки операторна функція operator[]() тепер повертає посилання на елемент масиву, що  індексується  параметром  i,  то  оператор  індексації  елементів  масиву "[]" можна використовувати зліва від оператора присвоєння, що дасть змогу модифікувати будь-який елемент масиву.

    Одна з наявних переваг перевантаження оператора індексації елементів масиву "[]" полягає у тому, що за допомогою нього ми можемо забезпечити реалізацію безпечної індексації елементів масиву. Як уже зазначалося вище, у мові програмування C++ можливий вихід за межі масиву у процесі виконання програми без відповідного повідомлення (тобто без генерування повідомлення про динамічну помилку). Але,  якщо  створити  клас,  який містить масив,  і надати  доступ  до цього масиву тільки через перевантажений оператор індексації елементів масиву "[]", то в процесі виконання програми можливе перехоплення індексу, значення якого вийшло  за  дозволені  межі.  Наприклад,  наведений  нижче  код  програми (в  основу якої покладений програмний код попередньої) оснащена  засобом контролю потрапляння індексу масиву в допустимий інтервал його перебування.

Приклад3.  Демонстрація прикладу організації безпечного масиву

const int size = 3;

 

class aClass

{  

 int aMas[size];

public:

aClass() { for(int i=0; i<size; i++) aMas[i] = i*i; }

 int &operator[](int i);

};

 

  // Забезпечення контролю потрапляння індексу масиву

  // в допустимий інтервал його перебування.

int &aClass::operator[](int i)

{

 if(i<0 || i> size-1)

{

 cout << endl << "Znachennja indeksy " << i <<

            " vuhodut za me*i dopystumogo intervaly" << endl;

 //getch(); exit(1);

}

 return aMas[i];

}

 

void main()

{

aClass ObjA;

cout << "Znachennja elementiv mas <A>:" << endl;

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

 cout << "aMas[" << i << "]= " << ObjA[i] << endl;

ObjA[2] = 25;           // Оператор "[]" знаходиться в лівій частині.

cout << endl << "aMas[2]= " << ObjA[2];   // Відображається число 25.

ObjA[3] = 44;      // Виникає помилка тривалості виконання, оскільки

             // значення індексу 3 виходить за межі допустимого інтервалу.

}

   Внаслідок виконання ця програма відображає на екрані такі результати:

Значення елементів масиву <A>:

a[0]= 0

a[1]= 1

a[2]= 4

 

a[2]= 25

Значення індексу 3 виходить за межі масиву.

   У процесі виконання настанови

ObjA[3] = 44;

операторною  функцією  operator[]()  перехоплюється  помилка  порушення  меж  допустимого інтервалу перебування індексу масиву, після чого програма відразу завершується, щоб не допустити потім ніяких потенційно можливих руйнувань.


 

А также другие работы, которые могут Вас заинтересовать

36495. Термічна дифузія 233.6 KB
  Перший доданок являє собою потік взаємної дифузії молекул 1 газу а другий – термодифузійний потік. На рисунку вихідні сталі відносні концентрації змінились і набули вигляду концентрація молекул першого газу біля першої пластини; концентрація молекул першого газу біля другої пластини; концентрація молекул другого газу біля першої пластини; концентрація молекул другого газу біля другої пластини. В результаті такої конвекції нагріта частина газу рухається відносно холодної створюючи провиток. Очевидно що температура газу поблизу проволоки...
36496. Взаємна дифузія 175.31 KB
  Згідно із основним рівнянням переносу можна записати ; . Згідно із рівнянням Фіка яке справедливо і для суміші газів коефіцієнт дифузії першого газу у суміші двох газів . Рівняння політропного процесу робота при цьому процесі Ізотермічний і адіабатний процеси – це процеси ідеалізовані. Запишемо для нього рівняння.
36497. Квантовий підхід Дебая-Борна 315.41 KB
  Хоча швидкості молекул змінюються у стані термодинамічної рівноваги властивості газу залишаються сталими. Насправді закон про статистичний закон розподілу молекул за швидкостями можна сформулювати так : скільки молекул газу або яка їх частка мають швидкості значення яких лежать у деякому інтервалі наближеному до заданої швидкості Зрідження газів і методи одержання низьких температур. Рівняння ВандерВаальса показує що будь який газ може бути переведеним в рідкий стан але необхідною умовою для цього є попереднє охолодження газу до...
36498. Рівняння Ван-дер-Ваальса 238.96 KB
  Дія відштовхування зводиться до того що молекула не допускає проникнення у свій об’єм інших молекул. Отже сили відштовхування враховуються через деякий ефективний об’єм молекул. Якщо газ у нас не дуже стиснутий то взаємодії між молекулами будуть лише парні участь третьої четвертої та інших молекул малоймовірна. Припустимо що у посудині із об’ємом знаходяться лише дві однакові молекули.
36499. Розподіл газових молекул за проекціями (напрямками) швидкостей 3.96 MB
  Переписавши ось у такому вигляді отримане рівняння визначимо фізичний зміст цієї функції. У вибраній нами системі координат у просторі швидкостей відстань до початку координат і є модуль швидкості отже Тепер ми можемо записати таке рівняння . Такого роду рівняння мають назву функціональних. Для їх визначення ми повинні знайти два незалежних рівняння.
36500. Розподіл молекул у полі сил. Формула Больцмана. Барометрична формула. Дослід Перрена по визначенню числа Авогадро 258.99 KB
  Наявність зовнішньої сили призведе до того що молекули у просторі будуть розміщені неоднорідно отже створюватимуть у різних точках простору різний тиск. Для осі ця різниця тисків на грані паралелепіпеда перпендикулярні осі де зміна тиску на одиницю довжини; зміна тиску на бічних гранях; площа граней. Згадаємо що ; – відповідно повні диференціали зміни тиску та потенціальної енергії. Повний диференціал зміни тиску газу дорівнює добутку концентрації молекул на повний диференціал зміни потенціальної енергії молекули взятому з...
36501. Біноміальний розподіл 536.29 KB
  Кількість частинок у ньому . Кількість комірок у об’ємі причому завжди виконується умова тобто частинка завжди знайде собі місце. Виділимо у об’ємі менший фіксований об’єм і будемо шукати імовірність того що кількість частинок потрапить у цей об’єм. Кількість комірок у об’ємі повинно бути принаймні не меншою за щоб усі частинки могли розміститись.
36502. Тиск газу з точки зору молекулярно-кінетичної теорії. Основне рівняння кінетичної теорії ідеального газу. Зв’язок між тиском газу та середньою кінетичною енергією газових молекул 205.51 KB
  Основне рівняння кінетичної теорії ідеального газу. Зв’язок між тиском газу та середньою кінетичною енергією газових молекул. Розрахуємо тиск газу на стінку посудини.
36503. Рівність середньокінетичних енергій молекул газу при взаємодії двох газів із непроникливою стінкою 464.46 KB
  І тепер перейдемо до вивчення елементів симетрії кристалу. Елементи симетрії кристалів. Симетрія – це властивість тіла суміщатися із самим собою під час деяких операцій або перетворень симетрії. З однією операцією симетрії ми вже зустрічались на початку лекції – це трансляційна симетрія.