Comprobación de autoasignación en el operador de asignación

En C++, el operador de asignación debe sobrecargarse con la verificación de autoasignación.

Por ejemplo, considere la siguiente clase Array y la función de operador de asignación sobrecargada sin verificación de autoasignación.

// 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; 
}

Si tenemos un objeto digamos a1 de tipo Array y si tenemos una línea como a1 = a1 en alguna parte, el programa da como resultado un comportamiento impredecible porque no hay verificación de autoasignación en el código anterior. Para evitar el problema anterior, la verificación de autoasignación debe estar allí mientras se sobrecarga el operador de asignación. Por ejemplo, el siguiente código verifica la autoasignación.

// 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; 
}

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

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Categories C++

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *