我有一个类A,该类在其构造函数中为整数(由类成员称_pPtrMem指向)动态分配内存,并在析构函数中取消分配。为了避免浅复制,我重载了赋值运算符和复制构造函数。重载赋值运算符的广泛使用的方式如下:
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;
}
由于第二个版本相对简单得多且速度更快(没有取消分配,没有内存分配),为什么它没有被广泛使用?我无法解决的任何问题?
同样,我们从赋值运算符返回一个相同类型的对象以进行链接(a = b = c)...因此,除了返回 *而不是返回 *,还可以返回 iToAssign 对象,因为这两个对象现在应该相等?
最佳答案
如果_pPtrMem
是指向某种基本类型(例如,动态分配的数组)的指针,则使用第一个版本。如果指针指向具有正确实现的赋值运算符的单个对象,则第二个版本也可以做到。但是在那种情况下,我认为您根本不需要使用指针。
关于c++ - 重载C++赋值运算符的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15355919/