ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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;

 

11