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


 

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

23858. Оды 16.41 KB
  Первая ода Ломоносова На взятие Хотина 1739 посвящена победе над турками. Полная мифология российской истории разворачивается в одах посвящённых императрице Елисавете Петровне. Хотя по временам Он насылает на неё Свой гневно затем переменяет его на милость: Я в гневе Россам был ТворецНо ныне паки им Отец Ода 1742 г. Бог как и в прежних одахсокрушает злобу разрушая умыслы врагов России там же и в других местах.
23859. Повесть о Горе и Злочастии, как Горе-Злочастие довело молодца во иноческий чин 13.93 KB
  Молодец же пытается жить своим умом а объясняет автор это желание тем что молодец был в то время се мал и глуп не в полном разуме и несовершенен разумом.Хозяевам нравится что молодец ведёт себя по писанному учениюто есть так как и учили его родители.Но молодец кручинится а после признаётся при всех в том что ослушался родителей и спрашивает совета как жить на чужой стороне. Молодец слушается ГореЗлочастие пропивает все деньги и только после этого спохватывается и пытается избавиться от своего спутника ГоряЗлочастия.
23860. Повесть о Петре и Февронии Муромских 15.5 KB
  Змий рассказал княгине что смерть его будет от Петрова плеча от Агрикова меча. У князя был брат по имени Петр. Однажды Петр пришел к брату.
23861. Повесть о разорении Рязани Батыем 14.34 KB
  Через два года после перенесения иконы Николы Чудотворца на Русь приходит безбожный царь Батый. Батый посылает послов к рязанскому князю Юрию Ингоревичу предлагая следующие условия: рязанский князь сразу же отдаст по десятой части всего земли людей богатств. Безбожный царь Батый был льстив и немилостив.Узнав от одного предателя рязанского вельможи что у самого Федора Юрьевича есть красавица жена Батый обращается к нему с такимпредложением.
23862. Сказание о Дракуле воеводе 16.23 KB
  который за свою жестокость имел прозвище ЦепешСажатель на кол и Дракула Дракон. Был на Мунгьянской земле область Румынии восточная часть Валахиивоевода христианин греческой веры имя его повалашски Дракулаа понашему Дьявол. Дракула спросил их почему так поступили такое бесчестье ему нанесли. Дракула воздал послу тому пышные почести показал ему своё богатство сказав что не только готов платить дань царюно со всем воинством готов пойти к нему на службу.
23863. Слово о походе Игоревом, Игоря, сына Святославова, внука Ольгова 17.03 KB
  В самом начале Игорева похода случилось затмение солнца но князь пренебрег этим дурным знамением: все превозмогла жажда искусить Дона Великого.И начали князья про малое говорить: Это великое и сами на себя крамолу ковать. Великая печаль настала по всей русской земле: Игорькнязь погубил то чего добился отец его Святослав Ольгович пленивший половецкого хана Кобяка. А киевский князь Святослав видел смутный сон: одевали его черным покрывалом на кровати тисовой черпали синее вино с горем смешанноесыпали пустыми колчанами крупный...
23864. Специфика древнерусской литературы (ДРЛ) и этапы развития. 11-17 века 34.5 KB
  Время перехода от средневекового типа литературы к новому. Характеризуется появлением новых жанров и нового понимания задач литературы. Условия возникновения письменной литературы: письменность крещение Руси.
23865. Хождение за три моря 16.74 KB
  Купцов предупреждают что караван подстерегают татары.Хасанбек дает подарки осведомителям чтобы они провели их безопасным путем. В Дербенте Афанасий просит помощи у Василия Панина который благополучно дошел до Каспия и Хасанбека чтоб заступились за людейзахваченных в плен и вернули товары. Считалось то что пришло с моря собственность владельца побережья.
23866. Основные особенности древне-русской литры 42 KB
  Литературный этикет слагается:из представлений о том как должен был совершаться тот или иной ход событийН: князь дб торжественен его конь не мб хромым он не может болетьиз представлений о том как дБ вести себя действующее лицо в соотв со своим положениемиз представлений о том какими словами должно описываться событие.Летопись дает историю госва содержит точные документальные сведения о князьях создает легитимность правомочность власти подтверждает власть.Легенда о призвании варягов: 3 брата старший Рюрик = все русские...