Читать «Полный справочник по С++» онлайн - страница 427

Герберт Шилдт

• Строковые объекты должны инициализироваться либо строками, заключенными в кавычки, либо другим строковым объектом.

• Строки должны иметь произвольную и переменную длину. Следовательно, они должны размещаться в динамической памяти.

• Следует предусмотреть способ преобразования строкового объекта в строку, завершающуюся нулевым байтом.

Хотя наш класс по определению слабее стандартного, он обладает свойством, которым не обладает класс basic_string: удаление подстроки с помощью оператора

Класс, управляющий работой со строками, называется StrType. Его объявление приведено ниже.

class StrType { char *р; int size; public:

StrType();

StrType(char *str) ;

StrType(const StrType &o); II Конструктор копирования -StrType() { delete [] p; }

friend ostream &operator«(ostream bstream, StrType &o); friend istream &operator>>(istream bstream, StrType &o);

StrType operator=(StrType &o); II Присваивание объекта

// класса StrType. StrType operator=(char *s); // Присваивание строки,

// взятой в кавычки.

StrType operator+(StrType &o); II Конкатенация двух объектов

// класса StrType.

StrType operator+(char *s); // Конкатенация двух строк,

II взятых в кавычки.

friend StrType operator+(char *s, StrType &o); /*

// Конкатенация строки,

II заключенной в кавычки,

II с объектом класса StrType */

StrType operator-(StrType &o); 11 Вычитание подстроки.

StrType operator-(char *s); // Вычитание подстроки,

// взятой в кавычки.

II Сравнение объектов класса StrType.

int operator==(StrType &o) int operator!=(StrType &o) int operator<(StrType &o) int operator>(StrType &o) int operator<=(StrType &o) int operator>=(StrType &o)

// Операции над объектами II взятыми в кавычки, int operator==(char *s) { int operator!=(char *s) { int operator<(char *s) {

класса StrType и строками,

return !strcmp(p, s); } return strcmp(p, s); } return strcmp(p, s) <0; } return strcmp(p, s) >0; } return strcmp(p, s) <= 0; } return strcmp(p, s) >= 0; }

int strsizef) { return strlen(p); } // Размер строки, void makestr(char *s)

{ strcpy(s, p); } II Создать строку, взятую в кавычки.

II Преобразовать в тип char

operator char { return p; )

(>

} ;

Закрытый раздел класса StrType содержит только два члена: р и size. При создании строкового объекта динамическая память выделяется оператором new, а указатель на выделенную область записывается в указатель р. Строка, адресуемая указателем р, представляет собой обычный массив символов, завершающийся нулевым байтом. Размер строки записывается в поле size, хотя с технической точки зрения это не обязательно. Поскольку строка, на которую ссылается указатель р, завершается нулем, ее размер можно вычислять в любое время. Однако, как мы увидим, это значение используется членами класса StrType так часто, что повторяющиеся вызовы функции strlenO становятся неэффективными.

Устройство класса StrType рассматривается в следующих разделах.

II Без явной инициализации.