Перегрузка + = в C ++

Если я перегружен operator + и operator =, мне все равно нужно перегрузить operator + =, чтобы что-то вроде этого работало:

MyClass mc1, mc2;
mc1 += mc2;
 Artem Barger07 июл. 2009 г., 15:43
Эмпирические результаты легко получить, но бывают случаи, когда вам все еще нужны объяснения.
 MadH07 июл. 2009 г., 15:57
@ Артем уверен,иногд, в этом случае он даже не скомпилируется и не касается сложных функций семантики языка - просто выберите любую ссылку на C ++, он расскажет вам достаточно о перегрузке операторов
 Brian07 июл. 2009 г., 15:29
Попробуйте и убедитесь сами. Это невероятно быстрый тест.

Ответы на вопрос(3)

Решение Вопроса

поэтому вам нужно явно перегрузить его, так как компилятор не знает, как строить головоломки для вас. но вы все равно можете извлечь выгоду из уже определенных / перегруженных операторов, используя их внутри оператора + =.

Обычный трюк - определитьoperator+=, а затем внедритьoperator+ с точки зрения этого, что-то вроде этого:

MyClass operator+ (MyClass lhs, const MyClass& rhs){
  return lhs += rhs;
}

Если вы делаете это наоборот (используйте + для реализации + =), вы получаете ненужную операцию копирования в операторе + =, что может быть проблемой в коде, чувствительном к производительности.

 GManNickG07 апр. 2010 г., 04:05
Старый, я знаю, но лучше просто взятьlhs по значению вместо того, чтобы делать копию вручную.
 jalf07 апр. 2010 г., 12:24
@ GMan: Ты прав. Интересно, почему я не сделал это в первый раз. Считайте, что это исправлено. :)
 GManNickG07 апр. 2010 г., 16:04
@ jalf: И если ты хочешь быть очень кратким,return lhs += rhs;. :)
 jalf07 апр. 2010 г., 17:27
@ GMan: pf, теперь ты просто хвастаешься. Несправедливо исправлять мой код прямо сейчас. Я занят паникой по поводу магистерской диссертации! Не ожидайте, что я сейчас напишу разумный код! ;) (Также исправлено)
 sbi26 июн. 2010 г., 14:08
@ GMan: IIRC, мне однажды показали, чтоreturn lhs += rhs; может быть пессимизацией, так как компилятору сложнее понять, что+= возвращаетlhs, что затрудняет применение RVO. Это было десять лет назад, и, возможно, компиляторы достаточно умны, чтобы сделать это, но я буду цепляться заlhs += rhs; return lhs; на всякий случай. И, @jalf, удачи тебе в этом!

«Я не хочу писать множество повторяющихся операторов, скажите, пожалуйста, как этого избежать», тогда ответ может быть следующим:

http: //www.boost.org/doc/libs/1_38_0/libs/utility/operators.ht

Синтаксис выглядит немного странно. Поскольку я никогда не использовал его сам, я не могу заверить вас, что это действительно просто.

Ваш ответ на вопрос