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

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

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

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


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


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

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

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

Ваш e-mail не будет опубликован.

64 + = 73

Поиск

 
     

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

https://www.litres.ru/aleksey-nikolaevich-vasilev/programmirovanie-na-c-v-primerah-i-zadachah-22054458/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Демотиватор

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок