📜  在分配运算符自我分配检查

📅  最后修改于: 2021-05-30 13:53:34             🧑  作者: Mango

在C++中,应使用自赋值检查来重载赋值运算符。

例如,考虑以下类别的Array和重载的赋值运算符函数,而无需进行自赋值检查。

// A sample class
class Array {
 private:
   int *ptr;
   int size;
 public:
   Array& operator = (const Array &rhs);
   // constructors and other functions of class........
};
  
// Overloaded assignment operator for class Array (without self 
// assignment check)
Array& Array::operator = (const Array &rhs)
{
  // Deallocate old memory
  delete [] ptr;
  
  // allocate new space
  ptr = new int [rhs.size];
  
  // copy values
  size = rhs.size;
  for(int i = 0; i < size; i++)
    ptr[i] = rhs.ptr[i];
  
  return *this; 
}

如果我们有一个数组类型的对象比如A1,如果我们有像A1 = A1某处线,在不可预知的行为程序的结果,因为在上面的代码中没有自赋值检查。为避免上述问题,在使赋值运算符重载时,必须进行自我赋值检查。例如,以下代码进行自我分配检查。

// Overloaded assignment operator for class Array (with self 
// assignment check)
Array& Array::operator = (const Array &rhs)
{
  /* SELF ASSIGNMENT CHECK */
  if(this != &rhs)
  {
    // Deallocate old memory
    delete [] ptr;
  
    // allocate new space
    ptr = new int [rhs.size];
  
    // copy values
    size = rhs.size;
    for(int i = 0; i < size; i++)
      ptr[i] = rhs.ptr[i];    
  }  
  
  return *this; 
}

参考:
http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”