Справочная информация: У меня сложный класс с множеством переменных. У меня есть надежный и проверенный конструктор копирования:
Applepie::Applepie( const Applepie ©) :
m_crust(copy.m_crust),
m_filling(copy.m_filling)
{
}
Некоторые конструкторы копирования переменных-членов, вызываемые в списке инициализатора, выполняют распределение.
Вопрос:
Мне нужно создать operator =
. Вместо того, чтобы дублировать существующий конструктор с присваиванием вместо списка инициализации и освобождением памяти, которая заменяется, и т. Д. И т. Д., Могу я просто сделать следующее:
Applepie& Applepie::operator=( const Applepie ©)
{
if( this != ©)
{
this->~Applepie(); // release own object
new(this) Applepie(copy); // placement new copy constructor
}
return *this;
}
Другими словами, это уничтожить себя, за которым семантически следует размещение нового конструктора копирования идентично operator =?
Это, по-видимому, потенциально может значительно сократить количество повторений кода и подтвердить, что каждая переменная инициализирована правильно, за счет возможной небольшой потери эффективности во время присваивания. Мне не хватает чего-то более непонятного?
Обоснование: В моем текущем классе около 30 вариантов. Меня беспокоит тот факт, что и мой конструктор копирования, и мой оператор присваивания должны копировать все тридцать, и что код может отличаться, в результате чего две операции будут действовать по-разному.