определяющий оператор +, = и + = - PullRequest
2 голосов
/ 20 марта 2011

Я однажды прочитал следующее заявление из заметок C ++,

В C ++ определение оператора + и = не дает правильного значения + =. Эта языковая ошибка исправлена ​​в C #

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

Ответы [ 4 ]

4 голосов
/ 20 марта 2011

Я предпочитаю механизм перегрузки операторов C ++.По моему мнению, это не ошибка проектирования.

+, = и += - три разных оператора.Если вы хотите использовать +=, вам нужно перегрузить +=.Перегрузка + и = не заставит += работать.

Я хотел бы добавить, что в E1 += E2 E1 оценивается только один раз, что касается C ++.Я не знаю точных правил в C #.

2 голосов
/ 20 марта 2011

В нем написано, что в C #, если вы перегружены, оператор + C # автоматически эмулирует оператор + = как комбинацию + и = (a=a+b равно a+=b).В C ++ это не реализовано, но это не ошибка.В C ++ + и = не дает + =, потому что в основном + = работает быстрее, чем +, потому что нет необходимости создавать еще один объект.

Именно поэтому в основном operator + пишется с использованием оператора + =.Рассмотрим следующий код:

class foo
{
public:
   foo& operator+=(const foo& rhs)
   {
   //.......
   }
};
const foo operator+(const foo& lhs,const foo& rhs)
{
   foo temp = lhs;
   return temp+= rhs;
}
0 голосов
/ 20 марта 2011

C # не допускает перегрузку оператора =, поскольку не допускает непосредственное управление указателем.Его поведение фиксируется в зависимости от того, является ли это ссылкой или типом значения.По той же причине вы не можете перегружать + =.Это значение всегда будет делать сумму и назначение.Поэтому вы можете только решить, какое значение для + имеет ваша структура данных.

0 голосов
/ 20 марта 2011

Это означает, что в C ++, если вы определили свой собственный оператор + и оператор = для своего класса, это еще не означает, что ваш класс автоматически будет поддерживать оператор +=. Если вы хотите, чтобы оператор += работал для вашего класса, вы должны определить += явно и отдельно.

В C #, если я правильно понял, определение операторов + и = для вашего класса также будет означать, что вы сможете использовать оператор += с вашим классом. += будет «эмулироваться» через комбинацию оператора + и оператора =. Например. выражение a += b будет интерпретировано как a = a + b.

Это не работает в C ++. Если вы не определите += явно, a += b приведет к ошибке компилятора, даже если вы определили + и =.

...