C++ Operador de asignación


Ejemplo

El operador de asignación es uno de los operadores más importantes porque le permite cambiar el estado de una variable.

Si no sobrecarga el operador de asignación para su class / struct , el compilador lo genera automáticamente: el operador de asignación generado automáticamente realiza una "asignación de miembros", es decir, invocando operadores de asignación en todos los miembros, para que se copie un objeto al otro, un miembro a la vez. El operador de asignación debe estar sobrecargado cuando la asignación simple de miembros no es adecuada para su class / struct , por ejemplo, si necesita realizar una copia profunda de un objeto.

Sobrecargar el operador de asignación = es fácil, pero debe seguir algunos pasos simples.

  1. Prueba de autoasignación. Esta verificación es importante por dos razones:
    • una autoasignación es una copia innecesaria, por lo que no tiene sentido realizarla;
    • El siguiente paso no funcionará en el caso de una autoasignación.
  2. Limpia los datos antiguos. Los datos antiguos deben ser reemplazados por otros nuevos. Ahora, puede comprender el segundo motivo del paso anterior: si se destruyó el contenido del objeto, una autoasignación no podrá realizar la copia.
  3. Copia todos los miembros. Si sobrecarga el operador de asignación para su class o su struct , el compilador no lo genera automáticamente, por lo que deberá hacerse cargo de copiar todos los miembros del otro objeto.
  4. Devuelve *this . El operador regresa solo por referencia, porque permite el encadenamiento (es decir, int b = (a = 6) + 4; //b == 10 ).
//T is some type
T& operator=(const T& other)
{
    //Do something (like copying values)
    return *this;
}

Nota: other se pasa por const& , porque el objeto que se asigna no debe cambiarse, y pasar por referencia es más rápido que por valor, y para asegurarse de que operator= no lo modifique accidentalmente, es const .

El operador de asignación solo se puede sobrecargar en la class / struct , porque el valor izquierdo de = es siempre la class / struct sí. Definirlo como una función gratuita no tiene esta garantía, y por eso no está permitido.

Cuando lo declara en la class / struct , el valor de la izquierda es implícitamente la class / struct sí, por lo que no hay problema con eso.