Я видел много уроков и пытался найти ответ на stackoverflow, но безуспешно.
В чем я не уверен, так это Есть ли какая-то практика, когда возвращать по значению или по ссылке, при перегрузке оператора?
Например,
Class &operator+(){
Class obj;
//...
return obj;
}
или то же самое, но по значению
Class operator+(){
Class obj;
//...
return obj;
}
И я хотел бы отметить, я заметил, что почти в 90% случаев при возврате одного и того же объекта (*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
) возвращается (т.е. не копия).
Первый вариант возвращения из operator+
по ссылке неверно, потому что вы возвращаете локальный объект по ссылке, но локальный объект перестает существовать после окончания тела операторной функции. В общем-то:
+=
или же -=
возврат по ссылке, потому что они возвращают сам мутированный объект (посредством: return *this;
)+
или же -
должен возвращаться по значению, потому что новый объект должен быть построен для хранения результата.