Перегрузка операции индексации [ ] в C++

Операция индексации обозначается как [ ] и обычно предполагает доступ к некоторому элементу массива. Эта операция требует себе двух участников: объект, к которому применяется, и номер запрашиваемого элемента. Это значит, что операция индексации относится к бинарным операциям, т. е. при перегрузке нужно использовать либо один параметр (если перегрузка описывается непосредственно внутри класса) — номер элемента, либо два параметра (если перегрузка описывается вне класса) — объект, к которому применяется и номер запрашиваемого элемента.
Выполняется такая перегрузка достаточно просто.

Программа, собранная из кода показанного в листинге #1, не выполняет ничего полезного: она только лишь отображает тот факт, что применение квадратных скобок не мешает компилироваться, т. е. факт перегрузки.
Поскольку операция индексации применяется либо к массивам, либо к указателям, выполняющим роль массивов, то, чтобы не отступать от идеологии, заложенной в операцию, перегружать её нужно для массивоподобных сущностей: т. е. при возврате отдавать элемент так, как если бы мы напрямую обращались к индексу массива.
Чтобы сделать работающую программу, нужно задействовать массивоподобную сущность, из которой и будет вытаскиваться элемент. Чтобы задействовать массивоподобную сущность, эту сущность нужно создать: используем указательную переменную для ручного управления памятью. Выделим область памяти и используем операцию индексации для записи и для чтения значений по индексу.

Как вы можете видеть, теперь объект класса имитирует обычный одномерный массив. С помощью конструктора память указательной переменной выделяется, с помощью деструктора высвобождается, а благодаря перегруженной операции [ ] нами объект класса используется подобно обычному массиву. Но этот код имеет один недостаток, наша недоделка не даёт использовать константный массив.


Чтобы исправить этот недостаток, нужно дописать ещё одну перегрузку операции [ ], обозначив константностью, что запрашиваемый элемент изменяться не будет:


Если делать подобие многомерного массива, то подход используется тот же самый, но поскольку есть только операция вида [ ], но нету подобий [][], то при перегрузке операции для нескольких скобок используют умение указательных переменных работать с операцией [ ] и возвращают указатель, а не ссылку. Если мы возвращаем ссылку на элемент, а у элемента тип, например, int, то, разумеется, что к конечному элементу нельзя применить операцию [ ], но если элемент указательная переменная, то можно. Поэтому достаточно возвращать указатель, чтобы добиться умения объекту класса выглядеть как многомерный массив.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/aleksey-nikolaevich-vasilev/programmirovanie-na-c-v-primerah-i-zadachah-22054458/?lfrom=15589587
Яндекс.Метрика