Выбрать главу

Реализация этого решения показана в следующей откорректированной программе.

// Эта программа работает корректно.

#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[]().