sencillos - sobrecargar<< c++
¿Qué es el tipo de retorno del operador de asignación? (3)
Estoy empezando C ++. Estoy un poco confundido sobre el tipo de devolución del operador de asignación y desreferencia. Estoy siguiendo el libro C ++ Primer. En varias ocasiones, el autor dice que el tipo de devolución del operador de asignación es una referencia al tipo de operando de la mano izquierda, pero más adelante, dice que el tipo de devolución es el tipo del operando de la mano izquierda. Me he referido C ++ 11 Estándar Sec. 5.17, donde el tipo de retorno se describe como "lvalue que se refiere al operando de la izquierda".
Del mismo modo, no puedo averiguar si la desreferencia devuelve el objeto señalado o la referencia al objeto.
¿Son estas declaraciones equivalentes? Si es así, entonces ¿cómo? Cualquier explicación sería apreciada.
Ambos pueden ser cualquier cosa, pero generalmente operator =
devuelve el objeto actual por referencia, es decir,
A& A::operator = ( ... )
{
return *this;
}
Y sí, "referencia al tipo de operando de la mano izquierda" y "lvalor que se refiere al operando de la mano izquierda" significa lo mismo.
El operador de desreferencia puede tener básicamente cualquier tipo de retorno. Depende principalmente de la lógica del programa, porque está sobrecargando el operador que se aplica a un objeto, no a un puntero al objeto. Por lo general, esto se usa para punteros inteligentes o iteradores, y devuelve el objeto que envuelven:
struct smart_ptr
{
T* innerPtr;
T* smart_ptr::operator* ()
{
return innerPtr;
}
}
smart_ptr p;
T* x = *p;
El estándar define correctamente el tipo de retorno de un operador de asignación. En realidad, la operación de asignación en sí no depende del valor de retorno, por eso el tipo de retorno no es fácil de entender.
El tipo de retorno es importante para las operaciones de encadenamiento. Considere la siguiente construcción: a = b = c;
. Esto debe ser igual a a = (b = c)
, es decir, c
debe asignarse en b
y b
en a
. Reescriba esto como a.operator=(b.operator=(c))
. Para que la asignación en a funcione correctamente, el tipo de retorno de b.operator=(c)
debe ser una referencia al resultado de la asignación interna (también funcionará con copia, pero eso es solo una sobrecarga innecesaria).
El tipo de retorno del operador de desreferencia depende de su lógica interna, defínalo de la manera que se ajuste a sus necesidades.
He visto problemas similares, pero creo que sería mejor usar
X& X::operator=(const X&);
Usando esto, podrá reutilizar el objeto en una asignación en cadena.