2013-05-31 4 views
2

Я читал, что реализация операторов как функция друга будет лучше. Как перегрузить оператор + = как функция друга, когда у меня уже есть + оператор-функция:Перегрузка + = оператор как функция друга

friend Dollar operator+(const Dollar &p1, const Dollar &p2); 
friend Dollar &operator+=(const Dollar &p1, const Dollar &p2); 

Это неправильно, так как мне нужно возвращать ссылку на переменный.

Dollar &operator+=(const Dollar &p1, const Dollar &p2) 
{ 
    return p1+p2; 
} 
+0

Что такое путаница, похоже, что вы возвращаете ссылку – aaronman

+2

Что обычно делается в обратном направлении: вы определяете 'operator +' в терминах 'operator + =' –

+0

Да, вы правы! Но что, если обе функции должны быть функцией друга, в отличие от функции-члена? –

ответ

4

Операторы перегрузки в качестве функций-друзей лучше, чтобы преобразования могли применяться как к левой, так и к правой стороне выражения. Например, stringoperator+ является другом, поэтому я могу написать "Hello " + string("World"), а не только писать string("Hello ") + "World".

Однако это рассуждение не применяется к мутаторам, таким как operator+=. Вы должны принять аргумент non-const left, который исключает возможность использования этого оператора во временном режиме. По этой причине рекомендуется использовать не мутирующие операторы как friend (или иначе свободные) функции и мутаторы в качестве функций-членов. (На самом деле, operator= могут быть перегружены только в качестве функции члена.)

1

Вам также необходимо изменить значение lvalue.

Dollar &operator+=(Dollar &p1, const Dollar &p2) 
{ 
    p1=p1+p2; 
    return p1; 
} 
+0

Это работает, но должно содержать предупреждение о том, что определение '+' в терминах '+ =' является более распространенным, потому что оно быстрее. –

0

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

+0

Замечание: в C++ 11, если вы имеете дело с литералом типа с операторами 'constexpr', вы не можете реализовать пересылку в этом направлении. В этой ситуации я обычно заканчиваю реализацию '+ =' в терминах '+' (или реализуя их независимо), поскольку оператор 'constexpr +()' не может эффективно вызывать мутатор по одному из своих аргументов. –

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