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


 

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

39034. Разработка технического задания на разработку ИС 77.5 KB
  Техническое задание ТЗ это завершающий предпроектную стадию документ который содержит цели и обоснование проектирования а также определяет основные требования к ИС и исходные данные необходимые при разработке. В настоящее время при составлении технического задания обычно руководствуются требованиями следующих ГОСТов: 34.60289 Техническое задание на создание автоматизированной системы описывает состав и содержание ТЗ которые распространяются на автоматизированную информационную систему в целом в том числе: общесистемные...
39035. Базовые технологии доступа к БД в Borland C++ Builder и их принципы 156 KB
  Указания к выполнению лабораторной работы Современные информационные системы не могут существовать без Баз Данных. По этой причине современные средства разработки приложений должны обеспечивать программиста средствами которые бы: Обеспечивали универсальный механизм доступа к базам данных построенных с использованием различных СУБД; Обеспечивали приемлемый уровень эффективности; Позволяли быстро разрабатывать полнофункциональные приложения для работы с БД любого размера. В Borlnd C Builder предлагается большое количество компонентов...
39036. Использование Borland C++ Builder в качестве средства быстрой разработки приложений 46 KB
  Компоненты для изучения: BitBtn StringGrid вкладка dditionl DteTimePicker вкладка Win32. Компоненты для изучения: StringGrid вкладка dditionl PgeControl вкладка Win32 Timer вкладка System. Компоненты для изучения: ColorBox вкладка dditionl RichEdit вкладка Win32 Timer вкладка System. Компоненты для изучения: MskEdit вкладка dditionl PgeControl вкладка Win32 Timer вкладка System.
39037. Разработка многооконных приложений с использованием Borland C++ Builder 88.5 KB
  Для добавления новой формы в проект приложения необходимо вызвать команду File New Form главного меню или нажать соответствующую кнопку на панели инструментов. Для каждой формы приложения вызывается метод CreteForm создать форму объекта приложения ppliction. Главная форма автоматически отображается на экране при запуске приложения в то время как остальные формы которые иногда называют вторичными будут созданы но останутся невидимыми для пользователя до тех пор пока не будут явно...
39038. Количество информации. Мера Хартли и мера Шеннона 80.5 KB
  Рассмотрение предложенных способов измерения количества информации удобно начать с примера. Тем не менее только на основе априорной информации мы не можем точно сказать какое именно число очков выпало в результате конкретного подбрасывания. С поступлением новой информации о результате подбрасывания эта неопределенность может уменьшаться.
39039. Понятие информационной системы 98.5 KB
  Сейчас пришло время дать этому понятию более точное определение: Информационная система ИС это взаимосвязанная совокупность средств методов и персонала используемых для хранения обработки и выдачи информации в интересах достижения поставленной цели. Как видно из определения информационные системы обеспечивают сбор хранение обработку поиск выдачу информации необходимой в процессе принятия решений задач из любой области. Основными элементами работы информационных систем являются: ввод новой информации и выдача текущей информации по...
39040. Классификация информационных систем 123 KB
  Основная проблема классификации ИС заключается в том что единой системы оснований для классификации выработать не удалось. Предлагается классифицировать информационные системы по следующим признакам: По масштабам применения настольные офисные и корпоративные. ПО: различные программные приложения связанных общим информационным фондом Такие приложения создаются с помощью так называемых настольных СУБД FoxPro Prdox dBse MS ccess или с помощью файловой системы и диалоговой оболочки для ввода редактирования и обработки данных. Это...
39041. Документальные информационные системы 237 KB
  Практика показывает что чаще всего информация представлена не в виде структурированных массивов данных а в виде простых текстовых документов. В отличие от ФИПС в результате проведения информационного поиска ДИПС выдает потребителю не конкретные сведения факты а совокупность документов смысловое содержание которых соответствует его запросу. Поэтому для автоматизации информационного поиска необходимо формализовать представление смыслового содержания информационного запроса и документов то есть перейти от их записи на естественном языке...
39042. Фактографические информационные системы 194 KB
  Основными компонентами фактографических систем являются Базы Данных и системы управления Базами Данных СУБД. Ее основные задачи: распределение внешней памяти; определение структуры файла; способы именования файлов и отображение их имен на пространство адресов внешней памяти; обеспечение доступа к данным; обеспечение защиты данных в файлах; способы многопользовательского доступа к файлам. Ограничения файловых информационных систем Разделение и изоляция данных. Обработка данных из разных файлов обычно требует значительных усилий...