Реализация этого решения показана в следующей откорректированной программе.
// Эта программа работает корректно.
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class sample {
char *s;
public:
sample(); // обычный конструктор
sample(const sample &ob); // конструктор копии
~sample() {
if(s) delete [] s;
cout << "Освобождение s-памяти.\n";
}
void show() { cout << s << "\n"; }
void set(char *str);
sample operator=(sample &ob); // перегруженный оператор присваивания
};
// Обычный конструктор.
sample::sample()
{
s = new char('\0'); // Член s указывает на null-строку.
}
// Конструктор копии.
sample::sample(const sample &ob)
{
s = new char[strlen(ob.s)+1];
strcpy(s, ob.s);
}
// Загрузка строки.
void sample::set(char *str)
{
s = new char[strlen(str)+1];
strcpy(s, str);
}
// Перегрузка оператора присваивания.
sample sample::operator=(sample &ob)
{
/* Если выделенная область памяти имеет недостаточный размер, выделяется новая область памяти. */
if(strlen (ob.s) > strlen(s)) {
delete [] s;
s = new char[strlen(ob.s)+1];
}
strcpy(s, ob.s);
return *this;
}
// Эта функция возвращает объект типа sample.
sample input()
{
char instr[80];
sample str;
cout << "Введите строку: ";
cin >> instr;
str.set(instr);
return str;
}
int main()
{
sample ob;
// Присваиваем объект, возвращаемый
// функцией input(), объекту ob.
ob = input(); // Теперь здесь все в порядке!
ob.show();
return 0;
}
Эта программа теперь отображает такие результаты (в предположении, что на приглашение "Введите строку: " вы введете "Привет").
Введите строку: Привет
Освобождение s-памяти.
Освобождение s-памяти.
Освобождение s-памяти.
Привет
Освобождение s-памяти.
Как видите, эта программа теперь работает корректно. Вы должны понимать, почему выводится каждое из сообщений "Освобождение s-памяти. ". (Подсказка: одно из них вызвано инструкцией delete в теле операторной функции operator=().)
В дополнение к традиционным операторам C++ позволяет перегружать и более "экзотические", например, оператор индексации массивов ([]). В C++ (с точки зрения механизма перегрузки) оператор "[]" считается бинарным. Его можно перегружать только для класса и только с использованием функции-члена. Вот как выглядит общий формат операторной функции-члена operator[]().