Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Лафоре Р. -> "Объектно-ориентированное программирование в С++" -> 125

Объектно-ориентированное программирование в С++ - Лафоре Р.

Лафоре Р. Объектно-ориентированное программирование в С++ — М.: Питер, 2004. — 992 c.
Скачать (прямая ссылка): obektnoorentprogramm2004.djvu
Предыдущая << 1 .. 119 120 121 122 123 124 < 125 > 126 127 128 129 130 131 .. 341 >> Следующая


пользуемого для доступа к массиву индекса элемента. Она будет проверять, находитесь ли вы в границах массива. (Вы можете также использовать класс vector, описанный в главе 15 «Стандартная библиотека шаблонов (STL)».)

Для демонстрации перегрузки операции индексации массива мы должны вернуться к другой теме, с которой мы уже встречались в главе 5, — возвращению значений из функции по ссылке. Перегруженная операция индексации должна возвращать свои значения по ссылке. Чтобы показать, почему это так, мы рассмотрим три программы, которые реализуют «безопасный» массив, каждая при этом использует свой подход для вставки и считывания элементов массива:

¦ два отдельных метода put() и get();

¦ метод access(), использующий возвращение по ссылке;

¦ перегруженная операция [ ], использующая возвращение по ссылке.

Все три программы используют класс safearray, в котором определен массив, состоящий из 100 элементов типа int. И все три проверяют, находится ли элемент, к которому мы хотим получить доступ, в границах массива. Функция main() каждой из программ заполняет массив значениями (каждое из которых равно значению индекса массива, умноженному на 10) и затем выводит их все, чтобы показать, что пользователь сделал все правильно.

Два отдельных метода put() и get()

В первой программе мы используем для доступа к элементам массива два метода: putel() для вставки элемента в массив и getel() для получения значения нужного нам элемента. Оба метода проверяют, чтобы значение индекса массива входило в рамки границ массива. То есть оно не должно быть меньше 0 и больше размера массива (минус 1). Приведем листинг программы ARR0VER1. // arroverl.cpp

// демонстрация создания безопасного массива, проверяющего Il свои индексы при использовании

// используются отдельные функции для установки и получения значения finclude <iostream> using namespace std;

#include «process.h> // для функции exit const int LIMIT = 100: Il размер массива ///////////////////////////////////////////////////////////

class safearray {

private:

int arr [ LIMIT ]: public:

// установка значения элемента массива

void putel ( int п. int elvalue ) {

if ( п < О И п >= LIMIT )

{ cout « "\п0шибочный индекс!": exit ( 1 ): } arr [ п ] = elvalue:

}

Il получение значения элемента массива

int getel ( int n ) const { 332

Глава 8. Перегрузка операций

if ( n < О 11 n >- LIMIT )

{ cout « 'ЛпОшибочный индекс!": exit ( 1 ); } return arr [ n ]:

}

}:

///////////////////////////////////////////////////////////

int main ( ) {

safearray sal:

// задаем значения элементов for ( int j = 0; j < LIMIT; j++ ) sal.putel ( j. j * 10 );

// показываем элементы

for ( j = 0: j < LIMIT: j++ ) {

int temp = sal.getel ( j );

cout « "Элемент " « j « " равен " « temp « endl;

}

return 0:

}

Данные помещаются в массив с помощью метода putel() и выводятся на дисплей с помощью метода getel(). Безопасность массива реализована с помощью вывода сообщения об ошибке при попытке использования индекса, не входящего в границы массива. Однако этот формат несколько груб.

Метод access (), использующий возвращение по ссылке

Как оказывается, мы можем использовать один метод для вставки и вывода элементов массива. Секрет этого метода в использовании возвращения значения по ссылке. Это означает, что мы можем записать функцию с левой стороны знака равно, при этом переменной, стоящей справа, будет присвоено значение, возвращаемое функцией, как показано в главе 5. Приведем листинг программы ARR0VER2.

// arrover2.cpp

// демонстрация создания безопасного массива, проверяющего // свои индексы при использовании

// используется общая функция для установки и получения значения findude <iostream> using namespace std;

#in'clude «process.h> // для функции exit

const int LIMIT - 100: // размер массива

/////////////////////////////У///////.//////////////////////

class safearray {

private:

int arr [ LIMIT ]; public:

// обратите внимание, что функция возвращает ссыпку!

int& access ( int n ) {

if ( n < 0 11 n >= LIMIT ) { cout « 'ЛпОшибочный индекс!": exit ( 1 ): } Перегрузка бинарных операций_333

return arr [ п ]:

}

}:

IimiimiimiimimiiiiimiiiiiniiIIiimmmmii

int main ( ) {

safearray sal:

II задаем значения элементов for ( 1nt j - 0: j < LIMIT: j++ ) sal.access ( j ) - j * 10: // используем функцию слева от знака -

// показываем элементы

for ( j = 0: j < LIMIT: j++ ) {

int temp = sal.access ( j ): // используем функцию справа от знака » cout « "Элемент " « j « " равен " « temp « endl:

}

return 0:

}

Строка sal.access ( j ) = j * 10:

означает, что значение j*10 будет помещено в элемент массива arr[j], ссылка на который возвращается методом.

Это использование одного метода для ввода и вывода элементов массива в общем случае немного более удобно, чем использование отдельных методов, на одно имя меньше. Но существует еще лучший способ, вовсе без имен.
Предыдущая << 1 .. 119 120 121 122 123 124 < 125 > 126 127 128 129 130 131 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100