Перегрузка оператора []

Перегрузка оператора [] позволяет обработать доступ к элементу по индексу, причем индекс может быть не только целочисленным. При перегрузке оператора [] через единственный параметр в «операторном» методе доступен индекс, расположенный внутри квадратных скобок. Внутри метода ко всем членам класса можно обращаться напрямую или через указатель this. Чтобы можно было присвоить значение элементу, расположенному по указанному индексу, необходимо внутри метода возвратить ссылку на элемент. Обратите внимание на то, что перегрузить оператор [] с помощью дружественной или обычной функции нельзя. Пример перегрузки оператора [] приведен в листинге 14.6.

Листинг 14.6. Перегрузка оператора []

#include <iostream>
#include <process.h>

class C {
   static const int size_ = 2;
   int arr_[size_];
public:
   C() { arr_[0] = 0; arr_[1] = 0; }
   C(int x, int y) { arr_[0] = x; arr_[1] = y; }
   int &operator[](int i);
   // Индекс может быть любого типа, например, строкой
   void operator[](const char *s) {
      std::cout << s << std::endl;
   }
};

int main() {
   C obj1, obj2(30, 40);
   obj1[0] = 10;
   obj1[1] = 20;
   std::cout << obj1[0] << std::endl;             // 10
   std::cout << (obj1[1] + obj2[0]) << std::endl; // 50
   obj1["string"];                                // string

   // Доступ через указатель
   C *pObj = new C(5, 8);
   // pObj[0] = 3; // Ошибка!
   (*pObj)[0] = 3; // OK
   std::cout << (*pObj)[0] << std::endl;          // 3
   std::cout << (*pObj)[1] << std::endl;          // 8
   delete pObj;
   return 0;
}

int &C::operator[](int i) {
   if (i < 0 || i >= size_) { // Проверка выхода за границы массива
      std::cout << "Error" << std::endl;
      exit(1);
   }
   return arr_[i];
}
На заметку

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов