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[]()  перехоплюється  помилка  порушення  меж  допустимого інтервалу перебування індексу масиву, після чого програма відразу завершується, щоб не допустити потім ніяких потенційно можливих руйнувань.


 

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

82977. Виготовлення геометричних фігур при допомозі аплікації. Порівняння фігур за кольором, розміром, формою 1.67 MB
  Мета: вчити виготовляти геометричні фігури з паперу за допомогою аплікаціїпорівнювати фігури за кольором формою розміром; розвивати розумові здібності мовлення творчі здібності учнів; виховувати любов до своєї родини; допомогти дитині зрозуміти які цінності є духовним фундаментом повноцінної...
82978. Творимо казковий світ «Кольорочас». We create the world of wonder «Colourtime» 623.5 KB
  Мета: географія ознайомити учнів з етапами формування української нації;сформувати в учнів поняття про національний склад населення та пояснити причини його строкатості; назвати етнографічні групи українців та національні меншини; обґрунтувати географію розміщення історико географічних етнографічних...
82979. Казки народів світу, Ш. Перро «Кіт у чоботях» 1.58 MB
  Мета: Продовжити знайомство з казками народів світу. Формувати в учнів уміння повно, точно, емоційно робити висновки і висловлювати судження про прочитане та посилатися під час відповіді на текст книжки; активізувати читацьку пам’ять; збагачувати словниковий запас...
82980. Речення. Види речень за метою висловлювання 913 KB
  Мета: Допомогти глибше усвідомити поняття мета висловлювання; з’ясувати які будуть речення за метою висловлювання; формувати вміння визначати види речень за метою висловлювання; будувати речення різних типів; відпрацьовувати навички грамотного письма; розвивати навички зв’язного мовлення...
82981. Людина серед людей. Норми поведінки. Вихованість 126 KB
  Освітній продукт: колективно створений ілюстрований довідник Людина серед людей. Людина серед людей. В усі часи ще з самого початку виникнення на Землі Людини вона почала замислюватися над своїм призначенням в житті над своїм значенням для інших людей і всього світу.
82982. Основні права та обов’язки громадянина 159.5 KB
  Формувати правові знання учнів; дати загальне поняття про моральні норми загальнолюдські цінності; виховувати пошану до законів України; виховувати громадянські почуття; формувати правову свідомість молодших школярів.
82983. Традиції харчування 141.5 KB
  Очікувані результати: учні повинні знати чотири групи їжі; учні повинні вміти визначати корисні продукти харчування дотримуватись правил поведінки за столом та не забувати місцеві традиції харчування. Обладнання і матеріали: підручник м’яч дзеркало малюнки із зображенням продуктів харчування...
82984. Позакласне читання. Урок-гра «Країна Казки» 275.5 KB
  Мета: навчальна –- поглибити знання учнів про казку як вид усної народної творчості активізувати читацьку пам’ять; корекційно розвивальна – удосконалювати навички виразного читання збагачувати словниковий запас розвивати творчі здібності коригувати логічне мислення...
82985. Первый раз в первый класс! 156 KB
  Цель: знакомство детей с учителем и между собой; развивать речь, внимание, память, наблюдательность, согласованность действий, расширять кругозор; воспитывать любовь к школе, желание учиться. Оборудование: макет школы на доске, карточки – цветы, пазлы с изображением животных, микрофон.