|
Программирование >> Расширенная версия языка c++
Чтоб ять, как работает оператор [], представим, что объект О индексируется следующим образом: Этот индекс транслируется в вызов функции 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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |