Перегрузка оператора ссылкой или значением C++

Я видел много уроков и пытался найти ответ на stackru, но безуспешно.

В чем я не уверен, так это Есть ли какая-то практика, когда возвращать по значению или по ссылке, при перегрузке оператора?

Например,

Class &operator+(){
  Class obj;
  //...
  return obj;
}

или то же самое, но по значению

Class operator+(){
  Class obj;
  //...
  return obj;
}

И я хотел бы отметить, я заметил, что почти в 90% случаев при возврате одного и того же объекта (*this), на который ссылается тот же возвращаемый объект. Может ли кто-нибудь объяснить, почему это так?

2 ответа

Первый вариант возвращения из operator+ по ссылке неверно, потому что вы возвращаете локальный объект по ссылке, но локальный объект перестает существовать после окончания тела операторной функции. В общем-то:

  • Мутирующие операторы типа += или же -= возврат по ссылке, потому что они возвращают сам мутированный объект (посредством: return *this;)
  • Нормальные операторы вроде + или же - должен возвращаться по значению, потому что новый объект должен быть построен для хранения результата.

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

Да, здесь есть несколько канонических форм. Они не все имеют одинаковую форму - они различаются в зависимости от оператора. Общий совет - следовать семантике встроенных типов. Как и для всех функций, применяются общие правила, например, не возвращать ссылки на локальные переменные (как показано в OP).

Например (находится в ссылке выше) с учетом оператора сложения вопроса;

class X
{
 public:
  X& operator+=(const X& rhs) // compound assignment (does not need to be a member,
  {                           // but often is, to modify the private members)
    /* addition of rhs to *this takes place here */
    return *this; // return the result by reference
  }

  // friends defined inside class body are inline and are hidden from non-ADL lookup
  friend X operator+(X lhs,        // passing lhs by value helps optimize chained a+b+c
                     const X& rhs) // otherwise, both parameters may be const references
  {
    lhs += rhs; // reuse compound assignment
    return lhs; // return the result by value (uses move constructor)
  }
};

operator+ не является членом метода (часто как friend) и возвращает по значению - это соответствует семантике встроенных типов. Точно так же operator+= является методом-членом и возвращается по ссылке (обновленная версия *this).

... при возврате того же объекта (*this), на который ссылается тот же возвращаемый объект. Может ли кто-нибудь объяснить, почему это так?

Если тип возвращаемого значения является побочным (X operator+), затем return *this; означает, что копия текущего объекта (на что указывает this) сделано и возвращено.

Если тип возвращаемого значения - по ссылке (X& operator+), затем return *this; означает, что ссылка на текущий объект (на что указывает this) возвращается (т.е. не копия).

Другие вопросы по тегам