Реализация методов assign чрезвычайно проста: всю работу фактически делает соответствующий конструктор, что и показано в листинге 4.8 на примере двух методов. Проверку параметров в явном виде нам делать не требуется, вся проверка уже «упрятана» в конструкторе.
Листинг 4.8. Реализация методов assign
TString& TString::assign(const char ch, byte count)
{ TString t(ch, count): // локальный объект - проверка параметров
*this = t: // изменение текущего объекта
return *this;
}
typedef TString::byte byte: // для краткости
TString& TString::assign(const char rhs[], byte ind, byte count)
{ TString t(rhs, ind, count); *this = t; return *this;
}
Остальные методы реализуются совершенно аналогично. Единственный вопрос заключается только в том, зачем нам понадобились эти методы. Разве нельзя обойтись только операцией присваивания? Дело в том, что операция присваивания — бинарная, поэтому параметр может быть только один — выражение, стоящее справа от знака операции. Для нашего класса строк — это присваиваемая строка того же типа TString.
Прототип операции присваивания для нашего класса TString такой (см. п. п. 12.8/10 в [1]):
TString& operator=(const TString &rhs);
Методы позволяют нам сделать присваивание значительно более гибкой операцией — мы можем оперировать любой подстрокой. |