Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции C++.doc
Скачиваний:
7
Добавлен:
01.05.2025
Размер:
1.44 Mб
Скачать

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

Кроме нескольких вышеперечисленных операторов, можно перегрузить и многие другие операторы C++. Большей частью требуется перегружать стандартные операторы, такие как арифметические, логические или операторы отношения. Тем не менее, имеется один достаточно экзотичный опера­тор, который бывает полезно перегружать: []. В C++ оператор [] при перегрузке рассматривается как бинарный оператор. Его следует перегружать с помощью функции-члена. Нельзя использовать дружественную функцию. Общая форма функции-оператора operator[]() имеет следующий вид:

тип имя_класса::operator[](int i)

Параметр не обязан иметь тип int, но поскольку функция operator[]() обычно используется для индексации массива, то в таком качестве обычно используется целое значение. Для заданного объекта A выражение

A[3]

преобразуется в вызов функции operator[]():

operator[](3)

В таком случае значение индекса передается функции operator[]() в качестве явного параметра. Указатель this указывает на объект A, тот самый, который вызывает функцию.

В следующей программе класс array содержит массив из трех переменных целого типа. Конст­руктор инициализирует каждый элемент массива заданным значением. Перегруженная функция-оператор operator[]() возвращает величину элемента массива, определяемого индексом, передава­емым в качестве параметра.

#include <iostream.h>

class array

{

int a[3];

public:

array(int i, int j, int k) { a[0] = i; a[1] = j; a[2] = k; }

int operator[](int i) { return a[i]; }

};

int main()

{

array A(1, 2, 3);

cout << A[1]; // выводит 2

return 0;

}

Можно создать функцию-оператор operator[]() таким образом, чтобы оператор [] можно было использовать как с левой, так и с правой стороны оператора присваивания. Для этого достаточно в качестве возвращаемой величины для operator[]() задать ссылку.

class array

{

int a[3];

public:

int& operator[](int i) { return a[i]; }

//…

};

Поскольку operator[]() возвращает ссылку на элемент массива, отвечающий индексу i, то он может быть использован с левой стороны операции присваивания для модификации элемента массива. Разумеется, этот оператор может быть использован и с правой стороны оператора присваивания.

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

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

#include <iostream.h>

#include <stdlib.h>

class array

{

int a[3];

public:

array(int i, int j, int k) { a[0] = i; a[1] = j; a[2] = k; }

int& operator[](int i);

};

int& array::operator[](int i)

{

if(i<0 || i>2)

{

cout << "Boundary Error\n";

exit(1);

}

return a[i];

}

int main()

{

array A(1, 2, 3) ;

cout << A[1]; // выводит 2

A[3] = 44; // генерируется ошибка времени выполнения поскольку 3 выходит за допустимые пределы

return 0;

}

При выполнении инструкции

A[3] = 44;

оператор перехватывает ошибку выхода за границу массива.