2012-05-04 17 views
6

Estoy leyendo el C++ cartilla, en el capítulo operación sobrecargada, el autor dio un ejemplo:¿Cuáles son los tipos de devolución de operadores en C++?

// member binary operator: left-hand operand bound to implicit this pointer 
Sales_item& Sales_item::operator+=(const Sales_item&); 
// nonmember binary operator: must declare a parameter for each operand 
Sales_item operator+(const Sales_item&, const Sales_item&); 

entonces, el autor explicó:

Esta diferencia coincide con los tipos de retorno de estos operadores cuando aplicado a tipos aritméticos: la adición arroja un valor r y la asignación compuesta devuelve una referencia al operando de la izquierda.

No estoy muy seguro de "compound assignment returns a reference to the left-hand operand". ¿Puede alguien dar más detalles sobre eso y cosas relevantes, por favor?

+0

Buscar el método de encadenamiento. Básicamente significa 'a = b' devuelve' a' de modo que 'c = a = b' se evalúa como' c = (a = b) 'o' a = b' luego 'c = a' todo en 1 enunciado. – chris

Respuesta

5

Esto significa que usted puede hacer algo como lo siguiente

a = 1; 
(a += 1) += 1; 

y el resultado será un == 3. Esto se debe a que la mayor parte llamada izquierda a + = modifica a y luego devuelve una referencia a eso. Luego, el siguiente + = opera en la referencia a a y nuevamente le agrega un número.

Por otro lado, el operador normal + devuelve copia del resultado, no una referencia a uno de los argumentos. Esto significa que una expresión como a + a = 3; es ilegal.

+1

"' a + = 1 + = 1; '". [¿Estás seguro de eso?] (Http://ideone.com/wK93x) –

+0

@ Robᵩ: seguramente está seguro de eso. Pero eso no quiere decir que sea correcto. -1 por respuesta incorrecta. – Nawaz

+1

@Nawaz: Me parece un poco duro el downvote, ya que se soluciona con [solo un par de paréntesis] (http://ideone.com/hdhf1).La esencia de la asignación de compuestos se ha capturado en la respuesta, por lo que fallar Davis porque se tropezó con un problema simple (artefacto de la pizarra) parece un poco difícil. –

2
a = a + b; 

es también

a += b; 

que es equivalente a

a.operator+= (b) 

operador + = soporta asignación compuesto:

(a += b) += c; 

es equivalente a

a.operator+= (b).operator+= (c); 

La última línea no sería posible si se devolviera un valor en lugar de un valor r.

considerar lo siguiente:

c = a + b; 

es también

c = a.operator+ (b); 

escribir

a.operator+ (b) = c; 

tiene ningún efecto porque el valor de una no se cambia.

Cuestiones relacionadas