Explicación detallada del tipo de valor de retorno de la función del operador de asignación

En el estudio de la función del operador de asignación de C ++, el problema del tipo de valor de retorno ha sido muy desconcertante. Hoy, resumo a fondo los resultados de cada tipo de valor de retorno diferente:

1. Cuando el valor de retorno está vacío:

<span style="font-size:14px;">void hasptr::operator=(const hasptr& s)</span>


En este momento, si solo hay una operación '=' (a = b), estará bien, pero si hay una operación en cadena de '=' (a = b = c), el compilador informará un error

Vemos: a = b = c;

El programa ejecutará b = c primero;

Debido a que el valor de retorno de la función se viola, entonces b = c esta operación devolverá un NULL

Entonces esto es a = (b = c), es decir, a = NULL. Este tipo de operación no existe. Incluso si existe, no cumple con nuestra intención original de esta operación.


2. Cuando el valor de retorno es la clase misma:

<span style="font-size:14px;">hasptr hasptr::operator=(const hasptr& s)</span>


Soporte '=' operación en cadena

Si el valor de retorno es la clase en sí, entonces el proceso de ejecución de esta función es:

                      1. Ingrese la función y ejecute la operación dentro de la función

                      2. Una vez finalizada la operación dentro de la función, llame al constructor de copia de la clase para copiar el objeto en un nuevo objeto.

                      3. Regrese al objeto recién creado


La clave aquí es que cada vez que se ejecuta la función de operador de asignación, se llama al constructor de la copia, lo que no solo pierde tiempo.

Si no hay un constructor de copia en la clase, a veces se producirán errores.


3. Cuando el valor de retorno es una referencia

<span style="font-size:14px;">hasptr &hasptr::operator=(const hasptr& s)</span>


Este método es el mejor, que admite la operación de la cadena y también reduce el tiempo de operación al mínimo.



Código completo:

<span style="font-size:14px;">hasptr &hasptr::operator=(const hasptr& s)
{
    i = s.i;
    string *x = new string(*s.ps);
    delete ps;
    ps = x;
    return *this;
}</span>


190 artículos originales publicados · 19 alabanzas · 200,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/zengchenacmer/article/details/38351385
Recomendado
Clasificación