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


 

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

34469. Быт и культура древнеславянских народов. Мифология древних славян. Культовые сооружения. Идолы 45.5 KB
  Некоторые Боги древних славян: Род богсоздатель видимого мира. Род родил Сварога великого бога который довершил творение мира. Сварог богсоздатель земли и небес. Велес один из величайших богов древнего мира сын Рода брат Сварога.
34470. Искусство Киевской Руси: принятие христианства, язык и письменность, фольклор, архитектура и изобразительное искусство, литература 22 KB
  Время развития Киевской Руси эпоху культурного дуализма период перемен когда старые культурные основы заменяются новыми в результате чего на первый план выходят внутренние противоречия. Причиной тому было введение на Руси христианства. Введение на Руси христианства привело не только к религиозному дуализму он существовал пока новая вера не была принята всей нацией но и к культурному дуализму в целом.
34471. Ростово-суздальская живопись. Периодизация. Влияние исторических событий на формирование живописного языка 42.5 KB
  Густые темносиние вишневые зеленые насыщенные краски сочетаются в иконах с белыми яркокрасными с золотом пробелов и фонов. В иконах этого времени чувствуются поиски русского национального типа лица Широкое в скулах и суживающиеся книзу округлое лицо Богоматери с ее небольшими глазами и тонким длинным но мягко закругленным внизу носом. Примеры икон домонгольского периода Богоматерь Великая Панагия найденная в Ярославле Ярославская Оранта Дмитрий Солунский из Дмитрова Спас Нерукотворный из Ростова Богоматерь...
34472. Искусство русского централизованного государства к.15 – н.16вв.: Деятельность В.Д. Ермолина. Формирование архитектурного ансамбля Московского Кремля. Архитектура Московского централизованного государства 54 KB
  Формирование архитектурного ансамбля Московского Кремля. При Иване III идет активная перестройка Кремля. Одним из архитекторов и реконструкторов старого Московского Кремля был Василий Ермолин. Ермолину было поручено возобновление белокаменных стен Московского Кремля.
34473. Живопись Феофана Грека 37.5 KB
  Из произведений Феофана Грека работавшего не покладая рук сохранилась только одна документально подтвержденная работа роспись церкви Спаса Преображения в Новгороде 1378 год. В образах Феофана огромная сила эмоционального воздействия в них звучит трагический пафос. Манера письма Феофана резкая стремительная темпераментная.
34474. Живопись Андрея Рублева 41.5 KB
  Образы Рублева навевают нам воспоминания об утерянной райской жизни об утерянном покое счастье и гармонии со вселенной. В творчестве Рублева отчетливее всего выразились мечты русского народа о самом хорошем человеке об идеальной человеческой красоте. Эпоха Рублева была эпохой возрождения веры в человека в его нравственные силы в его способность к самопожертвованию во имя высоких идеалов.
34475. Живопись Дионисия 41 KB
  Вот в такое время освобожденной обновляемой Руси как нельзя кстати пришелся светлый талант Дионисия его умение создавать праздничный настрой духа его сочные краски. Художественные тенденции последней трети XV начала XVI веков к праздничному декоративизму рафинированной утонченности и каноническому догматизму нашли в лице Дионисия тонкого истолкователя. О творчестве Дионисия в московский период можно судить только по двум произведениям: по иконе Божией Матери Одигитрия и по иконе Апокалипсис.
34476. Русское искусство 17в.: Живопись С. Ушакова. Деятельность оружейной палаты. Фресковая живопись. Парсуна 17.72 KB
  Тяга к наукам интерес в литературе к реальным сюжетам рост светской публицистики нарушение иконографических канонов в живописи сближение культового и гражданского зодчества любовь к декору к полихромии в архитектуре да и во всех изобразительных искусствах все это говорит о быстром процессе обмирщения культуры XVII в. Во главе нового движения провозглашающего те задачи живописи которые вели по сути к разрыву с древнерусской иконописной традицией стоял царский изограф теоретик искусства Симон Ушаков 16261686 взгляды которого...
34477. Строгоновская и годуновская школа иконописи. Особенности выразительного языка 18.35 KB
  Второе строгановская школа условно названная так потому что некоторые иконы выполнялись по заказу именитых людей Строгановых. Собирали иконы шитье и резьбу так что их домашние молельни стали настоящими музеями. Так они особенно ценили иконы совсем небольшого размера однако включающие не меньше отдельных сцен чем многоаршинный иконостас. Иконы этого типа напоминающие миниатюру или драгоценные эмалевые изделия и принято называть строгановскими даже если они не были написаны в мастерских Строгановых.