ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 8) онлайн
Объединение строк
Операция + не может быть использована для объединения строк. То есть мы не можем использовать выражение типа: str3 = str1 + str2;
где str1, str2 и str3 — строковые переменные (массивы типа char), и «кот» плюс «бегемот» равно «котбегемот». Однако если мы будем использовать свой собст- венный класс String из программы STROBJ главы 6, то мы сможем перегрузить операцию + для объединения строк. Это же делает и стандартный класс string в C++, но будет проще пронаблюдать этот процесс на примере нашего более про- стого класса String. Перегрузка операции + для выполнения действий, которые являются не совсем сложением, будет являться нашим следующим примером переопределения языка C++. Приведем листинг программы STRPLUS.
// strplus.cpp
// перегрузка операции + для строк
#include <iostream>
using namespace std;
#include <string.h> // для функций strcpy, strcat
#include <stdlib.h> // для функции exit
///////////////////////////////////////////////////////////
class String // наш класс для строк
{
private:
enum { SZ = 80 }; // максимальный размер строки
char str [ SZ ]; // массив для строки
public:
// конструктор без параметров
String ( )
{ strcpy ( str, "" ); }
// конструктор с одним параметром
String ( char s [ ] )
{ strcpy ( str, s ); }
// показ строки
void display ( ) const
{ cout << str; }
// оператор сложения
String operator+ ( String ss ) const
{
String temp; // временная переменная
if ( strlen ( str ) + strlen ( ss.str ) < SZ )
{
strcpy ( temp.str, str ); // копируем содержимое первой строки
strcat ( temp.str, ss.str ); // добавляем содержимое второй строки
}
else
{
cout << "\nПереполнение!";
exit ( 1 );
}
return temp; // возвращаем результат
}
};
///////////////////////////////////////////////////////////
int main ( )
{
String s1 = "\nС Рождеством! "; // используем конструктор с параметром
String s2 = "С Новым годом!"; // используем конструктор с параметром
String s3; // используем конструктор без параметров
// показываем строки
s1.display ( );
s2.display ( );
s3.display ( );
s3 = s1 + s2; // присваиваем строке s3 результат сложения строк s1 и s2
s3.display ( ); // показываем результат
cout << endl;
return 0;
}
Сначала программа выводит на дисплей три различные строки (третья строка пуста, поэтому ничего не выведется). Далее первые две строки объединяются и помещаются в третью строку, которая затем будет выведена на экран. Вот результат работы программы:
С Рождеством! С Новым годом! - s1, s2 и s3 (пока пуста)
С Рождеством! С Новым годом! - s3 после сложения
Перегрузка операции + в этом случае похожа на то, что мы делали ранее. Объявление
String operator+ ( String ss )
показывает, что функция operator+() принимает один аргумент типа String и возвра- щает объект того же типа. При объединении строк с помощью функции operator+() создается временный объект типа String, в него копируется строка объекта, для которого вызвана функция. Затем, используя библиотечную функцию strcat(), мы присоединяем к ней строку из объекта аргумента и возвращаем полученную во временном объекте строку. Заметим, что мы не можем использовать
return String ( string );
такой подход, где создается безымянный временный объект типа String, так как нам нужен доступ к временному объекту не только для его инициализации, но и для присоединения к нему строки аргумента.
Вам нужно быть внимательными, чтобы не допустить переполнения длины строки, используемой в классе String. Для предупреждения такого случая мы в функции operator+() проверяем, не превышает ли общая длина двух объединяемых строк максимально возможную длину строки. Если превышает, то мы выводим сообщение об ошибке вместо выполнения операции объединения. (Вы можете сообщить об ошибке и другим путем, например возвратив программе 0 или ис- ключив эту операцию, как мы обсудим в главе 14 «Шаблоны и исключения».)
Напомним, что при использовании enum для установки константы значение SZ временно фиксировано. Так как все компиляторы работают по стандартам C++, то вы можете изменить значение SZ
static const int SZ = 80;
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
