Re[3]: оператор копирования
От: iliks Россия http://iliks.livejournal.com
Дата: 07.09.05 16:44
Оценка:
> Вообще-то в операторе копирующего присваивания сначала удаляются текущие
> ресурсы класса (т.к. присваиваем "живому" объекту, имеющему выделенные
> ресурсы). Конструктор же оперирует с "мёртвым объектом", когда ресурсы
> никакие не выделены! Поэтому правильно написанный оператор копирующего
> присваивания попытается удалить ресурсы, которых у класса попросту нет!
У Страуструпа про это хорошо написано, раздел 10.4.4.1:
"Как это и бывает в большинстве случаев, копирующий конструктор и
копирующее присваивание значительно отличаются. Основная причина этого
состоит в том, что копирующий конструктор инициализирует "чистую"
(неинициализированную) память, в то время как копирующий оператор
присваивания должен правильно работать с уже созданным объектом."

(iliks: т.е. схема действий копирующего конструктора:
1. выделить новые ресурсы (память, ...)
2. скопировать члены переданного объекта.

схема действий оператора присваивания:
1. проверить, не присваиваем ли самому себе.
2. если нет, то удалить _текущее_внутреннее_представление_ (если оно
требует удаления или абстрактного "освобождения")
3. выделить новые ресурсы.
4. скопировать члены переданного объекта.

Как видим, в общем случае никак не возможно из копирующего конструктора
вызвать оператор присваивания, потому что семантика действий совсем разная.
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.