Операторы присвоения обычно должны возвращать ссылку на свой левый операнд.

Синтезируемый оператор присвоения копии

Подобно конструктору копий, компилятор создает синтезируемый оператор присвоения копии (synthesized assignment operator) для класса, если в нем не определен собственный. Аналогично конструктору копий, у некоторых классов синтезируемый оператор присвоения копии не подразумевает присвоения (раздел 13.1.6). В противном случае он присваивает значение каждой нестатической переменной-члена правого объекта соответствующей переменной-члену левого объекта с использованием оператора присвоения копии типа этой переменной. Массивы присваиваются поэлементно. Синтезируемый оператор присвоения копии возвращает ссылку на свой левый операнд.

Например, следующий код эквивалентен синтезируемому оператору присвоения копии класса Sales_data:

// эквивалент синтезируемого оператора присвоения копии

Sales_data&

Sales_data::operator=(const Sales_data &rhs) {

 bookNo = rhs.bookNo;         // вызов string::operator=

 units_sold = rhs.units_sold; // использует встроенное присвоение

 int revenue = rhs.revenue;   // использует встроенное

                              // присвоение double

 return *this;                // возвратить этот объект

}

Упражнения раздела 13.1.2

Упражнение 13.6. Что такое оператор присвоения копии? Когда он используется? Что делает синтезируемый оператор присвоения копии? Когда он синтезируется?

Упражнение 13.7. Что произойдет при присвоении одного объекта класса StrBlob другому? Что произойдет при присвоении объектов класса StrBlobPtr?

Упражнение 13.8. Напишите оператор присвоения для класса HasPtr из упражнения 13.5 раздела 13.1.1. Подобно конструктору копий, данный оператор присвоения должен копировать объект, на который указывает указатель рs.

<p>13.1.3. Деструктор</p>

Действие деструктора противоположно действию конструктора: конструкторы инициализируют нестатические переменные-члены объекта, а также могут выполнять другие действия; деструкторы осуществляют все действия, необходимые для освобождения использованных объектом ресурсов и удаления нестатических переменных-членов объекта.

Деструктор — это функция-член с именем класса, предваряемым тильдой (~). У нее нет ни параметров, ни возвращаемого значения:

class Foo {

public:

 ~Foo(); // деструктор

 // ...

};

Поскольку деструктор не получает никаких параметров, он не может быть перегружен. Для каждого класса возможен только один деструктор.

Что делает деструктор

Подобно тому, как конструктор имеет часть инициализации и тело (см. раздел 7.5.1), деструктор имеет тело и часть удаления. В конструкторе переменные-члены инициализируются перед выполнением тела, а инициализация членов осуществляется в порядке их объявления в классе. В деструкторе сначала выполняется тело, а затем происходит удаление членов. Переменные- члены удаляются в порядке, обратном их инициализации.

Тело деструктора осуществляет все операции, которые разработчик класса считает необходимыми выполнить после использования объекта. Как правило, деструктор освобождает ресурсы объекта, зарезервированные на протяжении его существования.

У деструктора нет ничего похожего на список инициализации конструктора для контроля удаления переменных-членов; часть удаления неявна. Происходящее при удалении переменной-члена зависит от его типа. Члены типа класса удаляются за счет выполнения его собственного деструктора. У встроенных типов нет деструкторов, поэтому для удаления членов встроенного типа не делается ничего.

Неявное удаление члена-указателя встроенного типа не удаляет объект, на который он указывает.

В отличие от обычных указателей, интеллектуальные указатели (см. раздел 12.1.1) являются классами и имеют деструкторы. Поэтому, в отличие от обычных указателей, члены, являющиеся интеллектуальными указателями, автоматически удаляются на фазе удаления.

Когда происходит вызов деструктора

Деструктор автоматически используется всякий раз, когда удаляется объект его типа.

• Переменные удаляются, когда выходят из области видимости.

• Переменные-члены объекта удаляются при удалении объекта, которому они принадлежат.

• Элементы в контейнере (будь то библиотечный контейнер или массив) удаляются при удалении контейнера.

• Динамически созданные объекты удаляются при применении оператора delete к указателю на объект (см. раздел 12.1.2).

• Временные объекты удаляются в конце выражения, в котором они были созданы.

Поскольку деструкторы выполняются автоматически, программы могут резервировать ресурсы и (обычно) не заботиться о том, когда они освобождаются.

Перейти на страницу:

Похожие книги