我有一个类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/

10-12 03:01