Программирование >>  Расширенная версия языка c++ 

1 ... 61 62 63 [ 64 ] 65 66 67 ... 227


Чтоб ять, как работает оператор [], представим, что объект О индексируется следующим образом:

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

о.operator[](9)

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

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

#include <iostream>

using namespace std;

const int SIZE - 5;

class arraytype { - -int a [SIZE] ;

public:

arraytype ( ) (

int i ;

for (i=o; i<SIZE; i-n- a[i] = i;

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

};

int main ( )

arraytype ob;

int i; , .;

for{i = 0; i<SIZE; + ) - -I-d t -T cout ob[i] ;

return 0;

В результате работы программы на экран выводится следующее:

0 12 3 4 .;, , , , . , , . . . , , -



ttinclude <iostreain> using namespace std;

const int SIZE = 5; !. if .if( ,v-;4 , ,-

class arraytype {

int a[SIZE]; .C.i: y. -r -Ji] public: - . у :-~ ! . arraytype (} { .: .ц .

int i; 1 i . for (i=o; KSrZE; i++) a[i] = i; .....

in or [ ] (int i) { return M i ]; } -

int mainO .

arraytype int i;

for(i=0; i<SIZE;

cout ob[ij ;

cout \n ; .-

добавление значения 10 к каждому элементу массива for{i=-0; KS1ZE; 1++}

ob[i] J+10; оператор [] слева от оператора =

for(1=0; i<SIZE; i++)

cout ob[i] ;

return 0;

В результате работы программы на экран выводится следующее:

0 12 3 4 -

10 11 12 13 14

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

В этом и остальных примерах инициализация массива а с помощью конструктора выполнена исключительно в иллюстративных целях и на самом деле

не требуется.

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



200 Самоучитель~C++

положить слева в инструкции присваивания. (Естественно, что как и прежде его можно располагать справа.) Таким образом, с объектами типа arraytype

можно обращаться так же, как и с обычными массивами.

3. Перегрузка оператора [] дает возможность по-новому взглянуть на задачу индексирования безопасного массива. Ранее в этой книге мы рассматривали простейший способ реализации безопасного массива, в котором для доступа к элементам массива использовались функции get() и put(). Перегрузка оператора [] позволит нам теперь создать такой массив гораздо проще. Вспомните, что безопасный массив - это массив, который инкапсулирован в классе, и при этом класс обеспечивает контроль границ массива. Такой подход предотвращает нарушение границ массива. Благодаря перегрузке оператора [], работать с безопасным массивом можно так же, как с обычным.

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

Пример безопасного массива j ,

ttinclude <iostream> #include <c3tdlib>

using namespace std; -

const int SIZE = 5;

class arraytype {

int a [SIZE] ; >

public: -

arraytype() { ,

int i;

for (i=o; KSIZE; i+ + ) a[i] = i;

in or[] (int i) ;

Обеспечение контроля границ для массива типа arraytype int fiarraytype or [ ] (int i)

if(i<0 I I i>SIZE-l} {

cou начение индекса ;

cou i находится за пределами границ массива. \п ; exit ; 1) ;

return



1 ... 61 62 63 [ 64 ] 65 66 67 ... 227

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика