Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

10 перегрузка

.pdf
Скачиваний:
15
Добавлен:
27.03.2015
Размер:
414.07 Кб
Скачать

10–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 &copy)

{

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;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]