Читать «Полный справочник по С++» онлайн - страница 432
Герберт Шилдт
Первые функции вполне очевидны. Функция strlen () возвращает длину строки, на которую ссылается указатель р. Поскольку длина этой строки может отличаться от значения, хранящегося в поле size (например, вследствие присваивания более короткой строки), длина строки вычисляется с помощью функции strlen(). Функция makestrО копирует строку, адресуемую указателем р, в символьный массив. Эта функция оказывается полезной, если необходимо превратить объект класса StrType в обычную строку.
Функция преобразования operator char* () возвращает указатель р, который ссылается на строку, хранящуюся в объекте. Эта функция позволяет использовать объект класса strType везде, где требуется обычная строка, завершающаяся нулевым байтом. Например, следующий фрагмент является вполне корректным.
StrType х(“Hello"); char s[20] ;
II Копирование строкового объекта с помощью функции strcpyO. strcpy(s, х); II Автоматическое преобразование в тип char *.
Напомним, что функция преобразования выполняется автоматически, если объект является частью выражения, для которого определено это преобразование. В данном случае, поскольку прототип функции strcpyO сообщает компилятору, что второй аргумент имеет тип char *, автоматически выполняется преобразование типа StrType в тип char *, и возвращается указатель на строку, содержащуюся в объекте х. Затем этот указатель используется функцией strcpyO для копирования строки в аргумент s. Благодаря функции преобразования вместо аргумента типа char * в любой функции можно использовать объект класса strType.
Преобразование в тип char *нарушает принцип инкапсуляции, поскольку, если функция получает указатель на строку, она может модифицировать ее непосредственно, без помощи функций — членов класса StrType и самого объекта. По этой причине преобразование в тип char * следует применять осторожно. Модификацию строки можно предотвратить, заставив функцию преобразования в тип char * возвращать константный указатель. В этом случае инкапсуляция нарушена не будет. Читатели могут сами попробовать изменить класс, руководствуясь этими указаниями.
На заметку
—J Полное определение класса StrType
Ниже приведена программа, содержащая полное определение класса StrType.
♦include <iostream>
♦include <new>
#include <cstring> #include <cstdlib> using namespace std;
class StrType { char *p; int size; public:
StrType();
StrTypefchar *str);
StrType(const StrType &o); II Конструктор копирования.
-StrTypeО { delete [] p; }
friend ostream &operator«(ostream &stream, StrType &o),-friend istream &operator>>(istream istream, StrType &o);
StrType operator=(StrType &o); II Присваивание объекта
II класса StrType.
StrType operator=(char *s); II Присваивание строки,
11 взятой в кавычки.
StrType operator+(StrType &o); // Конкатенация объектов
II класса StrType.
StrType operator+(char *s); // Конкатенация строк,
// взятых в кавычки, friend StrType operator+(char *s, StrType &o); /* Конкатенация строки, взятой в кавычки, и объекта класса StrType. */