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

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

StrType StrType::operator+(StrType &o)

{

int len;

StrType temp;

delete [] temp.p;

len = strlen(o.p) + strlen(p) + 1; temp.size = len; try (

temp.p = new char[len];

} catch (bad_alloc xa) {

cout « "Ошибка при выделении памяти\п"; exit(1);

}

strcpy(temp.p, p); strcat(temp.p, o.p); return temp;

}

П Конкатенация объекта класса StrType со строкой,

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

StrType StrType::operator+(char *s)

{

int len;

StrType temp;

delete [] temp.p;

len = strlen(s) + strlen(p) + 1; temp.size = len; try {

temp.p = new char[len];

} catch (bad_alloc xa) {

cout « “Ошибка при распределении памяти\п"; exit(1);

}

strcat(temp.p, s); return temp;

}

// Конкатенация строки, взятой в кавычки,

// и объекта класса StrType.

StrType operator+(char *s, StrType &o)

{

int len;

StrType temp;

delete [] temp.p;

len = strlen(s) + strlen(o.p) + 1; temp.size = len; try {

temp.p = new char[len];

} catch (bad_alloc xa) {

cout « "Ошибка при распределении памяти\п"; exit(1);

}

strcpy (temp. p, s) ,-strcat(temp.p, o.p); return temp;

}

Все три функции работают приблизительно одинаково. Во-первых, создается временный объект temp класса StrType. Этот объект хранит результат.конкатенации и возвращается функциями в вызывающий модуль. Поскольку явная инициализация временного объекта не выполняется, при его создании выделяется только 1 байт (для символа-заполнителя). По этой причине память, на которую ссылается указатель temp.p, сначала освобождается, а затем функция выделяет область памяти, достаточную для того, чтобы в нее поместился результат конкатенации двух строк. В заключение, две строки копируются в область памяти, адресуемую указателем temp.p, и объект temp возвращается в вызывающий модуль.

Ш Вычитание подстроки

В классе basic_string не предусмотрена такая полезная функция, как вычитание подстроки. В соответствии со своим определением в классе StrType, эта операция удаляет из объекта все подстроки, совпадающие с указанной подстрокой. Вычитание подстроки выполняется с помощью оператора

Класс StrType предусматривает два вида вычитания подстроки. Первый вариант позволяет вычитать из объекта класса StrType другой объект этого типа. Второй вариант удаляет из объекта класса StrType все вхождения указанной подстроки, взятой в кавычки. Следующий фрагмент программы иллюстрирует оба варианта.

Ill Вычитание объектов класса StrType.

StrType StrType::operator-(StrType &substr)

{

StrType temp(p); char * s1; int i, j;

si = p;

for(i=0; *sl; i++) {

if(*sl!=*substr.p) { II Если символ не является первой temp.p[i] = *sl; II буквой подстроки, копируем его

//в объект temp.

sl++;

}

else {

for(j=0; substr.p[j]==sl[j] && substr.p[j]; j++) ;

if(!substr.p[j]) { II Если подстрока обнаружена,

II удаляем ее.

si += j; i--;

}

else { II Если нет, продолжаем копирование. temp.p[i] = *sl; sl + + ;

}

}

}

temp.p[i] = 1\01; return temp;

II Вычитание из объекта класса StrType строки,

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

StrType StrType::operator-(char *substr)

{

StrType temp(p); char *sl; int i, j;

si = p;

for(i=0; *sl; i++) {

if(*sl!=*substr) { II Если символ не является