ВУЗ:
Составители:
Рубрика:
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).
Первая из двух операций [ ] является стандартной, так как выпол-
няется над именем массива. При этом неважно, какой тип имеют его
элементы.
Вторая операция [ ] – переопределенная, так как результатом пер-
вой операции [ ] является объект типа А.
Встает вопрос: когда имеет смысл переопределять операцию [ ]?
Попробуем создать АТД, который можно было бы использовать в
программе подобно массиву.
Чтобы создание такого типа имело смысл, необходимо преодолеть
основные недостатки, свойственные обычным массивам С++, а именно:
необходимость задания размера массива на стадии ком-
пиляции;
отсутствие контроля выхода за границы массива;
Страницы
- « первая
- ‹ предыдущая
- …
- 126
- 127
- 128
- 129
- 130
- …
- следующая ›
- последняя »
