У меня есть класс A, который динамически выделяет память для целого числа (указывается memmber класса say _pPtrMem) в своем конструкторе и освобождает его в деструкторе. Чтобы избежать мелкой копии, я перегрузил оператор присваивания и конструктор копирования. Широко используемый способ, в котором перегружен оператор присваивания следующим образом:Лучший способ перегрузить оператор присваивания C++
A& operator = (const A & iToAssign)
{
if (this == & iToAssign) // Check for self assignment
return *this;
int * pTemp = new int(*(iToAssign._pPtrMem)); // Allocate new memory with same value
if (pTemp)
{
delete _pPtrMem; // Delete the old memory
_pPtrMem = pTemp; // Assign the newly allocated memory
}
return *this; // Return the reference to object for chaining(a = b = c)
}
Другой способ реализации такой же может быть
A& operator = (const A & iToAssign)
{
*_pPtrMem= *(iToAssign._pPtrMem); // Just copy the values
return *this;
}
Поскольку вторая версия сравнительно гораздо проще и быстрее (не открепление, распределение памяти), почему он не используется широко? Любые проблемы, которые я не могу разобрать?
Также мы возвращаем объект того же типа от оператора присваивания для построения цепочки (а = Ь = с) ... так что вместо того, чтобы вернуться * это это прекрасно, чтобы вернуть iToAssign объект как оба объекта предположительно теперь равны?
Если у вас всего одно целое, зачем использовать указатели? Если у вас есть динамически распределенные массивы, используйте вместо этого 'std :: vector'. –
Примечание: в версии 1 'delete' слишком рано. Это должно быть сделано после того, как текущий объект находится в стабильном состоянии (в противном случае вы не предоставляете надежную гарантию исключения). Здесь он нестабилен, потому что вы назначаете текущий объект после удаления. Вы должны «std :: swap (_pPtrMem, pTemp); удалить pTemp;'. Еще лучше использовать идиому копирования и подкачки. –
@LokiAstari, но назначение указателей не может вызвать исключение, нет ничего, что может пойти не так. –