Читайте также:
|
|
Если член класса является массивом, то мы можем использовать индекс для доступа к элементам массива. Например, пусть определен класс:
# define size 100
class A
{
// private members
public:
int a_member[size];
// other public members
};
int main()
{
A an_obj;
//...
an_obj.a_member[3] = 5;
//...
}
При таком подходе существуют две проблемы. Во-первых, это срабатывает, если наш массив объявлен как открытый член класса. Во-вторых, этот подход усложняет код. Мы можем перегрузить операцию доступа по индексу так, что сможем иметь доступ к компонентам этого массива напрямую и сам массив не обязан быть, при этом, общедоступным членом класса. В этом случае, сам объект становится весьма похожим на ‘массив’
Пример 11-2.1 Класс Vector (Первая версия).
#include <iostream.h>
#define size 3
class Vector
{
int rep[size];
public:
const int& operator[ ](int index) const {return rep[index];}
int& operator[ ](int index) {return rep[index];}
};
ostream& operator<<(ostream& out, const Vector& a)
// При использовании перегруженной операции [ ], эта функция не имеет доступа
// к закрытым членам класса Vector
{
for (int i = 0; i < size; ++i)
{
out << a[i]; // используется константная версия операции [ ]
(i < size - 1)? (out << " "): (out << ".");
}
cout << endl;
return out;
}
int main()
{
Vector x, y;
cout << "Enter " << size << " integers.\n"; //запрос ввести массив целых чисел
for (int i = 0; i < size; ++i)
{ cin >> x[i]; } // используется неконстантная версия операции [ ]
y = x;
cout << y;
x[0] = 1; // опять неконстантная версия
cout << y;
return 0;
}
Объяснение.
(i) В ф-ии main(), x и y используются как массивы, но теперь мы можем присваивать один ‘массив’ другому (Вообще говоря, объект класса может быть скопирован в другой объект того же класса оператором присваивания …. Логическая почленная копия.). Заметим также, что изменение в x не приводит к изменению y. (В нашем случае, копия является физической … осталось только понять – что такое физическая копия)(!!)
(ii) Функция, перегружающая операцию [ ] возвращает ссылку, так что она (т.е. функция, а она, синтаксически, сводится к написанию скобок [ ]) может быть использована как лево-допустимое выражение (l-value), см. x[0] = 1;.
(iii) В большинстве случаев, функция, перегружающая операцию [ ] имеет две версии: константную версию и неконстантную. Константная версия используется для доступа к элементам массива без возможности изменять их, а неконстантная версия используется для модификации элементов массива. Если в классе определена только константная версия функции, то тогда наш массив не может быть модифицирован посредством операции индексации. В случае же, когда в классе определена только неконстантная версия функции, то любой константный объект нашего класса не сможет использовать операцию [ ].
(iv) Операция [ ] должна быть реализована как член-функция класса.
Дата добавления: 2015-11-16; просмотров: 40 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Перегрузка арифметических операций | | | Перегрузка операций присваивания |