2012-05-04 2 views
6

Читаю C++ Primer, в перегруженной операции главы, автор привел пример:Каковы возвращаемые типы операторов в 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&); 

затем, автор объяснил:

Эта разница соответствует возвращаемые типы этих операторов, если применяется к арифметическим типам: добавление дает значение rvalue и составное присваивание возвращает ссылку на левый операнд.

Я не совсем уверен в "compound assignment returns a reference to the left-hand operand". Может ли кто-нибудь подробно остановиться на этом, а также на соответствующие вещи, пожалуйста?

+0

Посмотрите метод цепной связи. В основном это означает, что 'a = b' возвращает' a', так что 'c = a = b' вычисляет' c = (a = b) 'или' a = b', а затем 'c = a' все в 1-м выражении. – chris

ответ

5

Это означает, что вы можете сделать что-то вроде следующего

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

и результат будет == 3. Это происходит потому, что самый левый вызов + = модифицирует a, а затем возвращает ссылку Это. Затем следующий + = работает с ссылкой на a и снова добавляет к нему номер.

С другой стороны, оператор normal + возвращает копию результата, а не ссылку на один из аргументов. Таким образом, это означает, что выражение, такое как a + a = 3;, является незаконным.

+1

"' a + = 1 + = 1; '". [Вы уверены в этом?] (Http://ideone.com/wK93x) –

+0

@ Robᵩ: Он уверен в этом. Но это не значит, что он прав. -1 для неправильного ответа. – Nawaz

+1

@Nawaz: Я считаю, что нижняя часть немного суровая, так как она решена с помощью [только пары круглых скобок] (http://ideone.com/hdhf1).Суть составного присвоения была зафиксирована в ответе, поэтому отказ Дэвиса, потому что он споткнулся о простой проблеме (артефакт доски), кажется, немного тяжело. –

2
a = a + b; 

также

a += b; 

что эквивалентно

a.operator+= (b) 

оператора + = поддерживает соединение назначение:

(a += b) += c; 

эквивалентно

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

Последняя строка не была бы возможна, если бы значение было возвращено вместо rvalue.

Рассмотрим следующий пример:

c = a + b; 

также

c = a.operator+ (b); 

написание

a.operator+ (b) = c; 

не имеет никакого эффекта, так как величина а не меняется.

Смежные вопросы