Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Перегрузка операции индексации

Читайте также:
  1. Аддитивная и мультипликативная операции коммутативны
  2. Активные операции коммерческого банка
  3. Атомарные операции
  4. Банковские операции.
  5. В дальнейшем изложении мы будем предполагать применение операции переименования во всех конфликтных случаях.
  6. Вложенные операторы If. Логические операции и выражения
  7. Вложенные операторы if. Сложное условие в операторе if. Логические операции

 

Если член класса является массивом, то мы можем использовать индекс для доступа к элементам массива. Например, пусть определен класс:

 

# 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 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Перегрузка арифметических операций| Перегрузка операций присваивания

mybiblioteka.su - 2015-2024 год. (0.005 сек.)