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


 

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

79224. Незаконное предпринимательство 33.01 KB
  171 УК РФ предполагает осуществление предпринимательской деятельности в нарушение установленного порядка регистрации лицензирования или в нарушение условий лицензирования. Непосредственный объект преступления общественные отношения регулирующие порядок занятия предпринимательской деятельностью. Объективная сторона преступления выражается в осуществлении предпринимательской деятельности либо без регистрации либо без специального разрешения лицензии в случаях когда такое разрешение обязательно или с нарушением условий лицензирования...
79225. Лжепредпринимательство 33.27 KB
  173 УК РФ определяется как создание коммерческой организации без намерения осуществлять предпринимательскую или банковскую деятельность имеющее целью получение кредитов освобождение от налогов извлечение иной имущественной выгоды или прикрытие запрещенной деятельности причинившее крупный ущерб гражданам организациям или государству. Этапы такой деятельности: подготовка необходимых документов принятие устава регистрация получение лицензии и т. Примеров такой деятельности к сожалению в настоящих условиях много. Субъектом преступления...
79226. Убийство. Понятие и виды 33.77 KB
  Основной состав убийства. Понятие убийства законодателем закреплено в ч. Квалифицированные виды убийства Квалифицированный состав отличается от основного состава тем что к признакам основного состава присоединяются дополнительные признаки они становятся обязательными либо отдельные признаки основного состава видоизменяются что влечет за собой повышение степени общественной опасности совершенного преступления. К квалифицированным видам убийства законодателем отнесены следующие: а двух или более лиц; б лица или его близких в связи с...
79227. Легализация (отмывание) денежных средств или иного имущества, приобретенного незаконным путем 34.13 KB
  Легализация отмывание денежных средств или иного имущества приобретенных другими лицами преступным путем ст. Предмет данного преступления денежные средства или иное имущество приобретенные преступным путем. Непосредственный объект преступления отношения регулирующие денежное обращение и иные имущественные отношения в экономической деятельности.
79228. Недопущение, ограничение или устранение конкуренции 36.27 KB
  Конкуренция это соперничество хозяйствующих субъектов при котором самостоятельными действиями каждого из них исключается или ограничивается возможность каждого из них в одностороннем порядке воздействовать на общие условия обращения товаров на соответствующем товарном рынке. Признаками ограничения конкуренции являются сокращение числа хозяйствующих субъектов не входящих в одну группу лиц на товарном рынке рост или снижение цены товара не связанные с соответствующими изменениями иных общих условий обращения товара на товарном рынке...
79229. Изготовление или сбыт поддельных денег или ценных бумаг 34.04 KB
  Изготовление или сбыт поддельных денег или ценных бумагст. Данная статья предусматривает уголовную ответственность за полную или частичную подделку фальшивомонетничество банковских билетов ЦБ РФ монет государственных ценных бумаг иных ценных бумаг в национальной или иностранной валюте. Объективная сторона преступления включает действия: а изготовление с целью сбыта поддельных денег или ценных бумаг; б сбыт поддельных денег или ценных бумаг.
79230. Контрабанда. Состав и виды 33.95 KB
  188 УК РФ заключается в незаконном перемещении через таможенную границу Российской Федерации товаров или иных предметов совершенном помимо или с сокрытием от таможенного контроля либо с обманным использованием документов или средств таможенной идентификации либо сопряженном с недекларированием или недостаточным неполным декларированием таких товаров предметов. Непосредственный основной объект преступления отношения регулирующие товарооборот перемещение через таможенную границу товаров и обеспечивающие поступление в бюджет таможенных...
79231. Невозвращение из-за границы средств в иностранной валюте 32.5 KB
  Невозвращение изза границы средств в иностранной валюте ст. 193 УК РФ устанавливает ответственность руководителей организаций за невозвращение изза границы валютных средств подлежащих обязательному перечислению на счета уполномоченного банка Российской Федерации. Непосредственный объект преступления отношения регулирующие внешнеэкономическую деятельность и расчеты совершаемые в иностранной валюте.
79232. Преднамеренное банкротство. Отличие от фиктивного банкротства 33.99 KB
  Непосредственный объект преступления включает отношения регулирующие порядок и процедуру банкротства и удовлетворения имущественных обязательств перед гражданами организациями государством. Объективная сторона преступления состоит в: а действиях по созданию условий неплатежеспособности; б действиях по увеличению неплатежеспособности; в бездействии с целью создания условий неплатежеспособности; г бездействии преследующем увеличение неплатежеспособности. Состав преступления материальный в этой связи наряду с деянием необходимо...