c ++ 11 — оператор перегружает ссылку или значение C ++

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

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

Например,

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

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

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

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

0

Решение

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

Да, есть некоторые канонические формы нашел здесь. Они не все имеют одинаковую форму — они различаются в зависимости от оператора. Общий совет — следовать семантике встроенных типов. Как и для всех функций, применяются общие правила, например, не возвращать ссылки на локальные переменные (как показано в 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) возвращается (т.е. не копия).

3

Другие решения

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

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

По вопросам рекламы [email protected]