#include <string.h>
class ttString {
char *s; int l;
public:
ttString(); // Различные
ttString( char *_s ); // версии
ttString( ttString& _s ); // конструктора
~ttString(); // Деструктор
ttString& operator =( char *_s ); // Различные версии
ttString& operator =( ttString &_s ); // оператора присваивания
ttString& operator +=( char *_s ); // Этого не было в задании, хотя
ttString& operator += ( ttString &_s ); // должно бы быть...
friend ttString& operator +( ttString &_s1, ttString &_s2 ); // Различные версии
friend ttString& operator +( ttString &_s1, char *_s2 ); // оператора
friend ttString& operator +( char *_s1, ttString &_s2 ); // конкатенации
};
ttString::ttString()
// Стандартный конструктор
{
s = 0; // Избавляемся от случайных значений указателя в памяти
l = 0;
}
ttString::ttString( char *_s )
// Конструктор, использующий массив символов как прототип
{
l = strlen( _s ); // Вычисляем длину строки
s = new char[l+1]; // Выделяем память
memcpy( s, _s, l ); // Выполняем копирование
}
ttString::ttString( ttString& _s )
// Конструктор, использующий другой объект как прототип
{
l = _s.l; // Крадём длину строки
s = new char[l+1]; // Выделяем память
memcpy( s, _s.s, l ); // Выполняем копирование
}
ttString::~ttString()
// Деструктор
{
if( s )delete s; // Освобождаем память
}
ttString& ttString::operator =( char *_s )
// Присваивание строке значения из массива символов
{
if( s )delete s; // Освобождаем буфер, если нужно
l = strlen( _s ); // Вычисляем длину строки
s = new char[l+1]; // Выделяем память
memcpy( s, _s, l ); // Выполняем копирование
return *this;
}
ttString& ttString::operator =( ttString &_s )
// Копирование объекта строки
{
if( s )delete s; // Освобождаем буфер, если нужно
l = _s.l; // Крадём длину строки
s = new char[l+1]; // Выделяем память
memcpy( s, _s.s, l ); // Выполняем копирование
return *this;
}
ttString& ttString::operator +=( char *_s )
// Конкатенация с другой строкой из массива символов
{
if( !s ) // Если эта строка пуста..
{
*this = _s; // ..передаём управление оператору присваивания,
return *this; // т.к. конкатенацию как таковую выполнять не нужно.
}
char *o = s;
l += strlen( _s ); // Вычисляем новую длину буфера
s = new char[l+1]; // Выделяем память
strcpy( s, o ); // Копируем строку из старого буфера..
strcat( s, _s ); // И складываем её с новой
delete o; // Убиваем старый буфер
return *this;
}
ttString& ttString::operator += ( ttString &_s )
// Конкатенация с другой строкой из такого же объекта
{
if( !s ) // Если эта строка пуста..
{
*this = _s; // ..передаём управление оператору присваивания,
return *this; // т.к. конкатенацию как таковую выполнять не нужно.
}
char *o = s;
l += _s.l; // Вычисляем новую длину буфера
s = new char[l+1]; // Выделяем память
strcpy( s, o ); // Копируем строку из старого буфера..
strcat( s, _s.s ); // И складываем её с новой
delete o; // Убиваем старый буфер
return *this;
}
ttString& operator +( ttString &_s1, ttString &_s2 )
// Конкатенация, продуктом которой станет вновь созданный объект
{
ttString *t;
t = new ttString( _s1 ); // Создаём новый объект и пишем в него первую часть строки
*t += _s2; // Затем просто складываем со второй
return *t; // И возвращаем этот объект
}
ttString& operator +( ttString &_s1, char *_s2 )
// Конкатенация, продуктом которой станет вновь созданный объект
{
ttString *t;
t = new ttString( _s1 ); // Создаём новый объект и пишем в него первую часть строки
*t += _s2; // Затем просто складываем со второй
return *t; // И возвращаем этот объект
}
ttString& operator +( char *_s1, ttString &_s2 )
// Конкатенация, продуктом которой станет вновь созданный объект
{
ttString *t;
t = new ttString( _s1 ); // Создаём новый объект и пишем в него первую часть строки
*t += _s2; // Затем просто складываем со второй
return *t; // И возвращаем этот объект
}