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


 

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

34484. Русская архитектура второй половины 18в. Деятельность М.Ф. Казакова 35 KB
  Казакова М. Казаков ученик архитектурной школы известного русского зодчего Д. возглавил школу и команду Казаков приобрел большой строительный опыт: участвовал в создании Головинского дворца Триумфальных ворот на Страстной площади в честь коронации Екатерины II галереи Оружейной палаты. Впервые дарование Казакова как архитектора раскрылось во время его участия в восстановлении Твери после пожара в мае 1763 г.
34485. Русское искусство к.18в.: Эпоха русского классицизма. Портретный и исторический жанр в творчестве А.П. Лосенко. М.Шибанов – зачинатель крестьянского бытового жанра 34.5 KB
  Лосенко. Лосенко 1737 1773 сын крестьянина ставший потом директором Академии. Будучи воспитанником Академии художеств Лосенко создал большую историческую картину на евангельский сюжет Чудесный улов . Лосенко много внимания уделял он живописным этюдам обнаженного тела; в результате появились известные полотна Авель и Каин .
34486. Русское искусство к.18в.: Исторический пейзаж в творчестве Ф.М. Матвеева, С.Ф. Щедрина. Городской пейзаж в творчестве Ф.Я. Алексеева 31 KB
  Классицизм стремился подчинить себе все виды живописи превратить их по сути дела в исторический жанр. Среди его работ наиболее известны серии видов Павловского Гатчинского и Петергофского парков виды Каменного острова и декоративные панно для Михайловского дворца в Петербурге. Щедрин запечатлел конкретные виды архитектурных сооружений но главную роль отводил не им а окружающей природе с которой человек и его творения оказываются в гармоническом слиянии. Виды уютны уравновешенны в них есть прелесть открытия нового чувства природы...
34487. Русское искусство к.18в.: Портрет в творчестве Ф.С. Рокотова, Д.Г. Левицкого, В.Л. Боровиковского 34 KB
  : Портрет в творчестве Ф. Новый этап в развитии портретного искусства которое теперь не ограничивается запечатлением индивидуальных черт человека но проникает в его внутренний мир ознаменовался творчеством Ф. Удивительная одаренность Рокотова быстро принесла ему известность и признание при дворе но лучшие произведения относятся к московскому периоду его жизни где расцвел талант художника в области интимных камерных портретов. Созданный Рокотовым тип портрета камерный интимный портрет составляет целую эпоху в русской портретной...
34488. Архитектура первой половины 19в.: от классицизма к ампиру. А.Н. Воронихин. Ж.Т. де Томон, А.Д.Захаров, К.И. Росси 85 KB
  : от классицизма к ампиру. В Российской империи стиль ампир появился при Александре I. Для возведения Исакиевского собора Александр I пригласил начинающего французского архитектора Анри Луи Огюста Рикар де Монферрана впоследствии ставшего одним из основоположников русского ампира. Ампир от фр.
34489. Скульптура первой половины 19в.Скульпторы И.П. Мартос, Ф.Ф. Щедрин 26.5 KB
  Мартос Ф. Мартос создатель памятника Минину и Пожарскому а также Ф. Иван Петрович Мартос выдающийся русский скульптормонументалист. Портрет как самостоятельный жанр не занимает в творчестве Мартоса значительного места.
34490. Русское искусство н.19в.: Романтизм в творчестве живописца О.А. Кипренского 35.5 KB
  В изобразительном искусстве начала столетия сформировалось и новое направление вошедшее в историю под названием романтизма явление европейской культуры в XVIII XIX веках представляющее собой реакцию на Просвещение и стимулированный им научнотехнический прогресс. В начале XIX века романтизм стал обозначением нового направления противоположного классицизму и Просвещению. Героические походы Суворова на рубеже XVIII XIX столетий войны с Наполеоном и наконец народноосвободительная Отечественная война 1812 года а вслед за ней дворянское...
34491. Русское искусство н.19в.: Тенденции реализма в романтическом творчестве В.А.Тропинина. Пейзаж С.Ф. Щедрина 34.5 KB
  Тропинин. С этой же целью Тропинин пытался не показывать явную социальную принадлежность людей. âПортрет Арсения Тропининаâ подкупает искренностью и чистотой эмоций написан он легко и обобщенно. âКружевницаâ одно из самых популярных произведений Тропинина.
34492. Русское искусство н.19в.: А.Г. Веницианов – основоположник русской жанровой живописи 28 KB
  Чтобы верно понять значение творческого наследие Венецианова необходимо вспомнить общее состояние русской художественной культуры первой четверти XIX века. Венецианов.Ранние портретные работы Венецианова несмотря на тонкую одухотворенность казались современникам слишком скромными лишенными артистического блеска недостаточно проникновенными. В самом деле Венецианов не был прирожденным портретистом.