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