При перегрузке оператора я не могу вернуться по ссылке? - PullRequest
3 голосов
/ 15 апреля 2020

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

class Cents
{
private:
    int m_cents;
public:
    Cents(int cents) { m_cents = cents; }
    friend Cents operator-( Cents &c1,  Cents &c2);// subtract Cents - Cents using a friend function
    int getCents() const { return m_cents; }
};

Cents &operator-( Cents &c1,  Cents &c2)
{
    c1.m_cents =  c1.m_cents - c2.m_cents;
    return c1;
}

Здесь я перегружены с использованием функции друга. Я изменил объект c1 и вернул его по ссылке. но я получаю ошибки, так что мы можем сделать что-то подобное?

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Я знаю, что при перегрузке оператора назначения копирования мы возвращаем объект по ссылке на цепочку назначений вместе, но я не могу сделать то же самое, то есть вернуться по ссылке при перегрузке оператора-?

Вы можете. Но это определенно не лучше, чем создать новый объект и вернуть разницу в этом. В конце концов, зачем менять значение передаваемого объекта?

Также обратите внимание на разницу в использовании, вместо этого оператор - работает как x = x-y (обычно это -=). из z = x-y, где z - это новый объект, в котором вы хотите сохранить результат вычитания.

Здесь я перегружен с использованием функции друга. Я изменил объект c1 и вернул его по ссылке. но я получаю ошибки, так что мы можем сделать что-то подобное?

Ваше объявление функции друга не соответствует перегруженному определению оператора, что является причиной ошибки.

Да, конечно. Однако обратите внимание, что перегрузка вашего оператора относится к -=, а не к -.

Изменить объявление в классе: (удалить ключевое слово friend)

Cents& operator-(const Cents& c1, const Cents &c2);

Соответствующее определение - перегрузка, работает как -=:

Cents& operator-(const Cents& c1, const Cents& c2) 
{ 
    c1.m_cents -= c2.m_cents;
    return c1; 
} 
1 голос
/ 15 апреля 2020

Поскольку вы фактически выполняете операцию "- =":

Cents& operator-=(const Cents& rhs)
{
  m_cents -= rhs.m_cents;
  return *this;
}

Это оператор-:

Cents operator-(const Cents& c1, const Cents &c2)
{
  return Cents(c1.m_cents - c2.m_cents);
}
...