Язык С++ и программирование на нем. Рейзлин В.И. - 128 стр.

UptoLike

Составители: 

130
Даже если array массив элементов абстрактного типа Class, вы-
ражение array [i] по-прежнему означает *(array + i), вне зависимости от
того, переопределена операция [ ] для типа Class или нет.
Пример:
class A {
int a [10];
public:
A(){ for ( int i = 0; i < 10; i ++ ) a [i] = i + 1; }
int operator [ ] ( int j ) {
return a [j]; }
};
void main ( ) {
A array [20];
cout << “array [3][5] = “ << array [3][5] << “.\n“;
}
Результатом работы программы будет: array [3][5] = 6.
Очевидно, что операция [ ], использованная в конструкторе клас-
са А, является стандартной, так как она выполняется над именем мас-
сива.
Рассмотрим теперь выражение array [3][5]. Результат его вычис-
ления является таким, как и ожидалось, по следующей причине: опера-
ция [ ] выполняется слева направо. Следовательно, выражение
array[3][5] интерпретируется как (array [3]).operator [ ](5).
Первая из двух операций [ ] является стандартной, так как выпол-
няется над именем массива. При этом неважно, какой тип имеют его
элементы.
Вторая операция [ ] переопределенная, так как результатом пер-
вой операции [ ] является объект типа А.
Встает вопрос: когда имеет смысл переопределять операцию [ ]?
Попробуем создать АТД, который можно было бы использовать в
программе подобно массиву.
Чтобы создание такого типа имело смысл, необходимо преодолеть
основные недостатки, свойственные обычным массивам С++, а именно:
необходимость задания размера массива на стадии ком-
пиляции;
отсутствие контроля выхода за границы массива;