2011-12-14 3 views
3
class Currency 
{ 
public: 
    explicit Currency(unsigned int value); 
    // method form of operator+= 
    Currency &operator +=(const Currency &other); // understood! 
    ... 
}; 

Следующий код показывает эквивалентный API, используя бесплатную функцию версии оператора:Свободные операторы против операторов-членов

class Currency 
{ 
public: 
    explicit Currency(unsigned int value); 
    ... 
}; 

// free function form of operator+= 
Currency &operator +=(Currency &lhs, const Currency &rhs); // ??? 

Question1> Почему свободная функция возвращает Currency& вместо Currency? Является ли это хорошей практикой?

Вопрос2> В реализации, что переменная должна использоваться для возврата, lhs или rhs?

ответ

5

Стандартное поведение operator+= состоит в том, чтобы увеличить lhs на rhs и вернуть ссылку на lhs.

В функции-члена lhs является вызывающим объектом, и, соответственно, он должен возвращать ссылку на себя. Кажется, вы ожидаете, что свободная функция будет вести себя иначе, чем функция-член. Зачем?

2

Вопрос 1: «Свободная функция» не имеет доступа к частным переменным-членам класса Currency. Если вам нужно использовать эти переменные для выполнения операции +=, то вы должны сделать оператор членом класса или сделать оператор, не являющийся членом, классом (см. Пример ниже). Помимо этого, они довольно похожи.

Вопрос 2: Возврат lhs. Это позволяет вам объединять вызовы, такие как a += b += c.

class Currency 
{ 
    friend Currency& operator+=(Currency &lhs, const Currency &rhs); 
}; 

Currency& operator+=(Currency &lhs, const Currency &rhs) 
{ 
} 

То же самое,

class Currency 
{ 
public: 
    friend Currency& operator+=(Currency &lhs, const Currency &rhs) 
    { 
    } 
}; 
+1

Или сделайте его другом. –

+0

Хорошая точка. Я обновил ответ. –

+0

Друг - это зло. – q0987

0

Что касается 1-й вопрос. Фактически вы можете вернуть объект по значению. Но вы всегда должны возвращать по ссылке (или указателю) к возврату по значению. Потому что возврат по значению включает копирование вызова ctor. Это снижает производительность. В случае выше вы определенно можете вернуть ссылку, так что сделайте это :)

Посмотрите на книгу Скотта Мейерса «Эффективный C++». Пункт 23: Не пытайтесь вернуть ссылку, когда вы должны вернуть объект. Больше подробностей.

0

Это нормально и хорошо для операторов, которые возвращают бит lhs - i.e дают компилятору намек на то, что ему не нужно создавать новый объект. Но такие операторы, как +, -, * и т. Д., Это было бы неверно, так как возвращаемое значение

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