Справочная информация:
У меня сложный класс со многими переменными. У меня есть надежный и проверенный экземпляр конструктора:
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 переменных. Я обеспокоен тем фактом, что и мой конструктор копирования, и мой оператор присваивания должны копировать все тридцать и что код может расходиться, в результате чего две операции будут действовать по-разному.