При выполнении эта программа выводит на экран строку Всем привет. Сначала она конкатенирует строки (объекты класса 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 = "Привет всем"; /* присваивание строки с завершающим нулем объекту */

с = а + " Георгий"; /* конкатенация объекта со строкой с завершающим нулем */

Следующая программа включает дополнительные определения операторов "=" и "+".

// Усовершенствование строкового класса.

#include

#include

using namespace std;

class str_type {

  char string[80];

 public:

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

  str_type operator+(str_type str);

  str_type operator+(char *str);

  str_type operator=(str_type str);

  str_type operator=(char *str);

  void show_str() { cout << string; }

};

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);

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги