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[]() перехоплюється помилка порушення меж допустимого інтервалу перебування індексу масиву, після чого програма відразу завершується, щоб не допустити потім ніяких потенційно можливих руйнувань.
А также другие работы, которые могут Вас заинтересовать | |||
35223. | Технічні пристрої организаціїї і регулювання руху транспорту. Регулювання вуличного руху | 1.24 MB | |
снують дорожні знаки за характером і організації інформації вирішують локальні завдання. Це, як правило, конконкретна інформація попередження, заборони, приписи, не враховує оперативних змін дорожніх і метеорологічних факторів, умов освітлення, характеристик транспортного потоку... | |||
35224. | Створення баз даних та робота з ними | 147 KB | |
Мета: вивчити структуру вікна додатка MS Access і основні засоби роботи з базами даних.. | |||
35225. | MS Access. Створення бази даних у вигляді декількох таблиць | 168 KB | |
Створення бази даних у вигляді декількох таблиць. План Основні поняття про бази даних. Задача Успішність Створити базу даних з трьох таблиць: Оцінки рис. Основні поняття про бази даних. | |||
35226. | КЛИНИКА, ДИАГНОСТИКА И ЛЕЧЕНИЕ ПОРАЖЕНИЙ ТОКСИЧНЫМИ ХИМИЧЕСКИМИ ВЕЩЕСТВАМИ | 975.5 KB | |
Яд – вещества вызывающие отравления в малых количествах. Понятие «малое количество» носит весьма субъективный характер. Некоторые яды вызывают смертельные исходы в дозах равных нескольким нанограммам (ботулотоксин), другие вещества (суррогаты алкоголя) вызывают отравления при поступлении в организм в количестве десятков, сотен грамм. | |||
35228. | Основи організації вуличного руху транспорту. Схеми переміщення транспорту. Організація руху на міських вулицях | 18.73 KB | |
Раціональна організація руху транспорту в містах дозволяє забезпечити високу швидкість і безпеку руху, найбільші зручності для пасажирів и економічність перевезень. | |||
35229. | Модифікація даних. Створення вихідних документів | 126.5 KB | |
Мета: Навчитися модифікувати дані, які знаходяться в таблицях. Навчитися створювати прості вихідні документи. | |||
35230. | Створення екранних форм | 453.5 KB | |
Создаем запрос для формы Рыночные цены Создаем ленточные формы Рыночные цены на основе запроса Рыночные цены и Справочник товаров с помощью мастера форм Открываем с помощью конструктора форму Рыночные цены Для создания расчетных итоговых полей которые содержат средние значения полей необходимо на панели элементов сначала нажать на кнопку поле b потом в Обпасти данных выделить место для построения расчетного итогового поля. Создаем форму Товары с помощью мастера форм Для создания иерархичной формы Товары и их цены в... | |||
35231. | Створення базових таблиць різними способами | 164 KB | |
Мета заняття: вивчити способи створення базових таблиць. Вивчити умови необхідні для створення взаємозвязаних таблиць і прийоми їх створення. Опишіть способи створення базових таблиць. | |||