Операция индексирования обычно перегружается когда тип класса представляет множество значений, для которых индексирование имеет смысл. Операция индексирования должна возвращать ссылку на элемент, содержащийся во множестве.


Пример 1
Пример перегрузки операции индексирования для класса Vect, предназначенного для хранения массива целых чисел и безопасной работы с ним.

#include<iostream.h>
#include<stdlib.h>

class Vect
{
public:
explicit Vect (int n=10);
Vect (const int a[], int n);  /* инициализация массива */
~Vect(){delete[] p;}
int &operator[] (int i);
void print();


private:
int *p;
int size;
};

Vect::Vect(int n):size(n)
{
p=new int[size];
for (int i=0; i<size; i++)
p[i]=a[i];

}
/* перегрузка операции индексации */
int &Vect::operator[](int i)
{
if(i<0 || i>=size)
{
cout<<"Неверный индекс (i="<<i<<")"<<endl;
cout<<"Завершение программы"<<endl;
exit(0);
}
return p[i];
}
void Vect::Print()
{
for(int i=0; i<size; i++)

cout<<p[i]<<" ";
cout<< endl;
}

int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
Vect a(arr, 10);
a Print();
cout<<a[5]<<endl;
cout<<a[12]<<endl;
return 0;
}

Результаты работы:
1 2 3 4 5 6 7 8 9 10
6
Неверный индекс (i=12)
Завершение программы

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