Читать «Полный справочник по С++» онлайн - страница 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 Без явной инициализации.