10 перегрузка
.pdf10–71
//ПО конкатенации (+=); склеивание
//левого и правого операндов и запись
//результата в левый операнд
String & String::operator+= (const String & r)
{
// сохранение перед удалением
char *temp = sPtr;
// копирование длины строки
length += r.length;
// выделение памяти
10–72
sPtr = new char [length+1];
// левая часть новой строки
strcpy(sPtr, temp);
// правая часть новой строки
strcat(sPtr, r.sPtr);
// освобождение памяти
delete [] temp;
// для сцепления операций присваивания
return *this;
}
10–73
// ПО проверки: объект пуст?
int String::operator!() const { return length == 0; }
//ПО проверки: левый объект меньше,
//чем правый?
int String::operator<(const String & r) const
{
return strcmp(sPtr, r.sPtr) < 0;
}
10–74
//ПО возвращения ссылки на символ в
//объекте
char & String::operator[](int index)
{
return sPtr[index];
}
// Получение длины строки
int String::getLength() const { return length; }
10–75
// ПО вывода объекта в поток
ostream & operator<<(ostream & output, const String & s)
{
output << s.sPtr; return output;
}
10–76
// ПО ввода объекта из потока
istream & operator>>(istream & input, String & s)
{
// Буфер входных данных
char temp[100]; input >> temp;
10–77
// ПО присваивания
s = temp;
//Здесь конструктор преобразования
//создает из строки temp
//временный объект, затем присваивает
//его объекту s и уничтожает
return input;
}
10–78
int main()
{
//Вызов конструктора преобразования
//char* -> String
String s1(”Привет ”), s2(”студент ”), s3, s4;
// Проверка работы ПО <
cout << ”s2 < s1 дает результат: ”
<< (s2 < s1) << endl;
10–79
// Проверка работы ПО ! и =
if(!s3)
{
cout << ”s3 пуст”
<< ”Объекту s3 присваивается
объект s1:” << endl; s3 = s1;
cout << ”s3 = ” << s3 << endl;
}
10–80
// Проверка работы ПО +=
cout << ”s1 += s2 дает рез-т:” << endl;
s1 += s2;
cout << ”s1 = ” << s1 << endl;
//Проверка работы конструктора
//преобразования
cout << ”s4 = \”НГТУ\” дает результат:”
<< endl;