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


 

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

25932. Отделители и короткозамыкатели. Назначение. Конструктивное исполнение. Принцип действия. Условия выбора. Совместная работа отделителей и короткозамыкателей 25 KB
  Для замены выключателей на стороне высокого напряжения используются короткозамыкатели и отделители. Отделитель служит для отключения обесточенной цепи высокого напряжения за малое время не более 01 сек. Короткозамыкатели и отделители устанавливаются на стороне высшего напряжения РУ малоответственных потребителей когда в целях экономии площади и стоимости РУ выключатели предусмотрены только на стороне низшего напряжения. Отделители и короткозамыкатели устанавливаются на стороне высшего напряжения в менее ответственных РУ в целях экономии...
25933. Реакторы. Назначение. Конструктивное исполнение. Принцип действия. Условия выбора. Сдвоенные реакторы 26 KB
  Реакторы. Сдвоенные реакторы. Для ограничения ударного тока короткого замыкания применяют токоограничивающие реакторы. По этой причине реакторы выполняют без стальных сердечников несмотря на то что при этом для поддержания такого же значения индуктивности их приходится делать больших размеров и массы.
25934. Измерительные трансформаторы тока и напряжения. Назначение. Конструктивное исполнение. Принцип действия. Условия выбора 26 KB
  Измерительные трансформаторы тока и напряжения. Трансформатор напряжения трансформатор предназначеный для преобразования высокого напряжения в низкое в цепях РЗиА. Применение трансформатора напряжения позволяет изолировать логические цепи защиты и цепи измерения от цепи высокого напряжения. Виды трансформаторов напряжения Заземляемый трансформатор напряжения однофазный трансформатор напряжения один конец первичной обмотки которого должен быть наглухо заземлен или трехфазный трансформатор напряжения нейтраль первичной обмотки которого...
25935. Разрядники: назначение, конструкция, принцип действия. Вентильные и трубчатые разрядники. Нелинейные ограничители перенапряжения (ОПН): назначение, конструкция, принцип действия. Условия выбора 52.5 KB
  Нелинейные ограничители перенапряжения ОПН: назначение конструкция принцип действия. В результате пробоя в трубке возникает интенсивная газогенерация и через выхлопное отверстие образуется продольное дутье достаточное для погашения дуги . ОПН Ограничитель перенапряжения нелинейный ОПН это разрядник без искровых промежутков. Активная часть ОПН состоит из последовательного набора варисторов.
25936. Устройство защитного отключения (УЗО). Назначение, схема подключения 53 KB
  Устройство защитного отключения УЗО. Устройство защитного отключения УЗО; более точное название: Устройство защитного отключения управляемое дифференциальным остаточным током сокр. УЗО−Д механический коммутационный аппарат или совокупность элементов которые при достижении превышении дифференциальным током заданного значения при определённых условиях эксплуатации должны вызвать размыкание контактов. Основная задача УЗО защита человека от поражения электрическим током и от возникновения пожара вызванного утечкой тока через...
25937. Конструкция и принцип действия воздушных выключателей. Достоинства и недостатки. Условия выбора. Сравнение с другими высоковольтными выключателями 27.5 KB
  Воздушные выключатели обладают высокими техническими характеристиками. Сетевые выключатели на напряжение 6кВ и выше применяемыев электрических сетях и предназначенные для пропуска и коммутации тока в нормальных условиях работы цепи и в условиях КЗ. Генераторные выключатели на напряжение 624 кВ предназначенные для пропуска и коммутации токов в нормальных условиях а также в пусковых режимах и при КЗ. Выключатели для электротермических установок с напряжениями 6220 кВ предназначенные для работы как в нормальных так и в аварийных режимах 4.
25938. Конструкция и принцип действия элегазовых выключателей. Достоинства и недостатки. Условия выбора. Сравнение с другими высоковольтными выключателями 23 KB
  В элегазовых выключателях гашение дуги происходит так же как и в воздушных выключателях при интенсивнои охлаждении дуги потоком газа. В элегазовых дугогасительных устройствах в отличие о воздушных при гашении дуги истечение газа через сопло происходит не в атмосферу а в замкнутый объем камеры заполненный элегазом при небольшом избыточном давлении. По способу гашения дуги в элегазе различают следующие ДУ: с системой продольного дутья в которую предварительно сжатый воздух поступает из резервуара с относительно высоким давлением элегаза ДУ...
25939. Выключатели нагрузки. Назначение, конструктивное исполнение и принцип действия выключателей нагрузки. Условия выбора 21 KB
  Выключатели нагрузки. Назначение конструктивное исполнение и принцип действия выключателей нагрузки. Выключатели нагрузки используются для оперативного соединения и разъединения цепи. Выключатель нагрузки обеспечивает двухкратное включение нормированного для него тока включения на короткое замыкание без повреждений препятствующих его дальнейшей работе в нормальном и эксплуатационном режиме.
25940. Расчет деревянных, металлических, железобетонных перекрытий 1.07 MB
  Орел 2011 Расчет деревянного перекрытия Подобрать сечение деревянной балки для перекрытия жилого дома.Предварительно принимаем собственный вес одного метра балки qnбалки=025кН м;f=1.1 qбалки= qnбалки f=0.Собираем нагрузку на погонный метр балки с учетом её собственного веса: qn=qnперекрытияlгр qnбалки=18140275=277кН м; q= qперекрытияlгр qбалки=234120275=3083кН м.