Выбрать главу

// Конкатенация двух строк.

str_type str_type::operator+(str_type str) {

 str_type temp;

 strcpy(temp.string, string);

 strcat(temp.string, str.string);

 return temp;

}

// Присваивание одной строки другой.

str_type str_type::operator=(str_type str) {

 strcpy(string, str.string);

 return *this;

}

Имея определения этих функций, покажем, как их можно использовать на примере следующей функции main().

int main()

{

 str_type а("Всем "), b("привет"), с;

 с = а + b;

 с.show_str();

 return 0;

}

При выполнении эта программа выводит на экран строку Всем привет. Сначала она конкатенирует строки (объекты класса str_type) а и b, а затем присваивает результат конкатенации строке c.

Следует иметь в виду, что операторы "=" и "+" определены только для объектов типа str_type. Например, следующая инструкция неработоспособна, поскольку она представляет собой попытку присвоить объекту а строку с завершающим нулем.

а = "Этого пока делать нельзя.";

Но класс str_type, как будет показано ниже, можно усовершенствовать и разрешить выполнение таких инструкций.

Для расширения круга операций, поддерживаемых классом str_type (например, чтобы можно было объектам типа str_type присваивать строки с завершающим нулем или конкатенировать строку с завершающим нулем с объектом типа str_type), необходимо перегрузить операторы "=" и "+" еще раз. Вначале изменим объявление класса.

class str_type {

  char string{80];

 public:

  str_type(char *str = "") { strcpy(string, str); }

  str_type operator+(str_type str); /* конкатенация объектов типа str_type*/

  str_type operator+(char *str); /* конкатенация объекта класса str_type со строкой с завершающим нулем */

  str_type operator=(str_type str); /* присваивание одного объекта типа str_type другому */

  char *operator=(char *str); /* присваивание строки с завершающим нулём объекту типа str_type */

  void show_str() { cout << string; }

};

Затем реализуем перегрузку операторных функций operator+() и operator=().

// Присваивание строки с завершающим нулем объекту типа str_type.

str_type str_type::operator=(char *str)

{

 str_type temp;

 strcpy(string, str);

 strcpy(temp.string, string);

 return temp;

}

// Конкатенация строки с завершающим нулем с объектом типа str_type.

str_type str_type::operator+(char *str)

{

 str_type temp;

 strcpy(temp.string, string);

 strcat(temp.string, str);

 return temp;

}

Внимательно рассмотрите код этих функций. Обратите внимание на то, что правый аргумент является не объектом типа str_type, а указателем на символьный массив с завершающим нулем, т.е. обычной С++-строкой. Но обе эти функции возвращают объект типа str_type. И хотя теоретически они могли бы возвращать объект любого другого типа, весь смысл их существования и состоит в том, чтобы возвращать объект типа str_type, поскольку результаты этих операций принимаются также объектами типа str_type. Достоинство определения строковой операции, в которой в качестве правого операнда участвует строка с завершающим нулем, заключается в том, что оно позволяет писать некоторые инструкции в естественной форме. Например, следующие инструкции вполне законны.

str_type a, b, c;

a = "Привет всем"; /* присваивание строки с завершающим нулем объекту */