Свободные операторы против операторов-членов - PullRequest
3 голосов
/ 14 декабря 2011
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 > Почему функция free должна возвращать Currency& вместо Currency? Это хорошая практика?

Question2 > В реализации, какую переменную следует использовать для возврата, lhs или rhs?

Ответы [ 4 ]

5 голосов
/ 14 декабря 2011

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

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

2 голосов
/ 14 декабря 2011

Вопрос 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)
    {
    }
};
0 голосов
/ 14 декабря 2011

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

0 голосов
/ 14 декабря 2011

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

Обратитесь к книге Скотта Мейерса "Effective C ++".Пункт 23: Не пытайтесь вернуть ссылку, когда вы должны вернуть объект.Для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...