10 перегрузка
.pdf10–61
Пример:
Когда в программе в том месте, где компилятор ожидает объект типа char*,
появляется объект s класса String, нап-р, cout << s;
он вызывает ПО
operator char*();
для приведения объекта к типу char* и
подставляет результат в выражение
10–62
5.11. Пример класса с полным набором ПО
class String {
friend ostream & operator<<(ostream &, const String &);
friend istream & operator>>(istream &, const String &);
public:
//Конструктор преобразования
//char* -> String
String(const char * = ””);
10–63
// Конструктор копий
String(const String &); ~String();
// ПО присваивания
const String & operator=(const String &); // ПО конкатенации
String & operator+=(const String &); // ПО проверки: String пуст?
int operator!() const;
10–64
// ПО проверки: s1 < s2 ?
int operator<(const String &) const; // ПО ссылки на символ
char & operator[](int);
// Функция вычисления длины строки
int getLength() const; private:
// Указатель на начало строки
char *sPtr;
10–65
// Длина строки
int length; };
10–66
// Конструктор преобразования char* -> String
String::String(const char *s)
{
cout << ”Конструктор преобразования: ”
<< s << endl; length = strlen(s);
sPtr = new char [length+1];
// Копирование строки в объект
strcpy(sPtr, s);
}
10–67
// Конструктор копий
String::String(const String ©)
{
cout << ”Конструктор копий: ”
<< copy.sPtr << endl; length = copy.length;
sPtr = new char [length+1];
// Копирование строки в объект
strcpy(sPtr, copy.sPtr);
}
10–68
// Деструктор
String::~String()
{
cout << ”Деструктор: ” << sPtr << endl;
delete [] sPtr;
}
//ПО присваивания (=) с защитой от
//самоприсваивания
10–69
const String & String::operator= (const String & r)
{
cout << ”Вызов operator= ” << endl;
// Проверка на самоприсваивание
if(&r != this) {
// Освобождение памяти
delete [] sPtr;
// Копирование длины строки
length = r.length;
10–70
// Выделение памяти
sPtr = new char [length+1];
// Копирование строки
strcpy(sPtr, r.sPtr);
}
else
cout << ”Попытка самоприсваивания”
<<endl;
//Для сцепления операций присваивания
return *this;
}