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