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

 

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

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

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


верно для функции и операторов, являющихся дружественными для класса. Мы обсудим имеющиеся возможности С++ в главе 11).

Для вычисления значения функции operator+() мы сначала складываем значения feet и inches обоих операндов (корректируя результат, если это необходимо). Полученные значения f и і мы затем используем при инициализации безымянного объекта класса Distance, который затем будет возвращен в выражение.

return Distance ( f, і );

Это похоже на расположение, используемое в C0UNTPP3, за исключением того, что конструктор принимает два аргумента вместо одного. В строке

d1st3 - distl + d1st2;

функции main() затем присваивается значение безымянного объекта класса Distance переменной dist3. Сравните это интуитивно-понятное выражение с использованием вызова функции для выполнения той же задачи, как это было сделано в программе ENGLC0N из главы 6.

Похожие методы вы сможете создать в классе Distance для перегрузки других операций. Тогда вы сможете выполнять вычитание, умножение и деление с объектами этого класса, используя обычную запись выражений.

Объединение строк

Операция + не может быть использована для объединения строк. То есть мы не можем использовать выражение типа: str3 = strl + str2:

где strl, str2 и str3 — строковые переменные (массивы типа char), и «кот» плюс «бегемот» равно «котбегемот». Однако если мы будем использовать свой собственный класс String из программы STROBJ главы 6, то мы сможем перегрузить операцию + для объединения строк. Это же делает и стандартный класс string в С++, но будет проще пронаблюдать этот процесс на примере нашего более простого класса String. Перегрузка операции + для выполнения действий, которые являются не совсем сложением, будет являться нашим следующим примером переопределения языка С++. Приведем листинг программы STRPLUS.

,7 strplus.срр

// перегрузка операции + для строк ¦include <iostream> using namespace std:

¦include <string.h> // для функций strcpy. strcat ¦include <stdlib.h> // для функции exit

Iiiitiiiimiiiiiiiiiiiimiiiiiiiiiiiiiiiiiimiiiiiiiiiii class String // наш класс для строк

I

private:

enum { SZ - 80: } // максимальный размер строки char str [ SZ ]: // массив для строки public:

// конструктор без параметров 324

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

String ( )

{ strcpy ( str. "" ): } // конструктор с одним параметром String ( char s [ ] )

{ strcpy ( str. s ): } // показ строки void display ( ) const

{ cout « str: } // оператор сложения

String operator+ ( String ss ) const {

String temp: // временная переменная

if ( Strien ( str ) + Strien ( ss.str ) < SZ ) {

strcpy ( temp.str, str ): // копируем содержимое первой строки strcat ( temp.str. ss.str ); // добавляем содержимое второй строки

}

else

{

cout « "\пПереполнение!": exit ( 1 ):

}

return temp; // возвращаем результат

}

}:

ітіііішішітіііішішіїїіііітшішшіїїіііш

int main ( ) {

String si = "\nC Рождеством! ": // используем конструктор с параметром String s2 = "С Новым годом!"; // используем конструктор с параметром String s3: // используем конструктор без параметров

// показываем строки si.display ( ): s2.display ( ): s3.display ( ):

s3 = si + s2;

s3.display ( ): cout « endl:

return 0:

}

Сначала программа выводит на дисплей три различные строки (третья строка пуста, поэтому ничего не выведется). Далее первые две строки объединяются и помещаются в третью строку, которая затем будет выведена на экран. Вот результат работы программы:

С Рождеством! С Новым годом! - si. s2 и S3 Спока пуста)

С Рождеством! С Новым годом! - s3 после сложения

Перегрузка операции + в этом случае похожа на то, что мы делали ранее. Объявление

String operator+ ( String ss );

// присваиваем строке S3 результат сложения строк Sl и s2 // показываем результат Перегрузка бинарных операций 325

показывает, что функция operator+() принимает один аргумент типа String и возвращает объект того же типа. При объединении строк с помощью функции operator+() создается временный объект типа String, в него копируется строка объекта, для которого вызвана функция. Затем, используя библиотечную функцию strcat(), мы присоединяем к ней строку из объекта аргумента и возвращаем полученную во временном объекте строку. Заметим, что мы не можем использовать

return String ( string ):

такой подход, где создается безымянный временный объект типа String, так как нам нужен доступ к временному объекту не только для его инициализации, но и для присоединения к нему строки аргумента.

Вам нужно быть внимательными, чтобы не допустить переполнения длины строки, используемой в классе String. Для предупреждения такого случая мы в функции operator+() проверяем, не превышает ли общая длина двух объединяемых строк максимально возможную длину строки. Если превышает, то мы выводим сообщение об ошибке вместо выполнения операции объединения. (Вы можете сообщить об ошибке и другим путем, например возвратив программе 0 или исключив эту операцию, как мы обсудим в главе 14 «Шаблоны и исключения».)
Предыдущая << 1 .. 116 117 118 119 120 121 < 122 > 123 124 125 126 127 128 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100