Для этого есть много вопросов и ответов, но я не могу найти , почему нам нужно вернуть по ссылке.Перегрузка оператора с использованием ostream и цепочки. Зачем возвращаться по ссылке?
Если мы (предположим, что оператор уже правильно перегружен для объекта MyObject):
MyObject obj1;
MyObject obj2;
cout << obj1 << obj2;
Теперь будет подвыражения, как ((соиЬ < < obj1) < < obj2)); Вопрос почему мы не можем вернуться по стоимости? (Хорошо, давайте предположим, что ему разрешено возвращать ostream как значение). Если cout < < obj1 возвращает объект потока вместо ссылки, в чем разница? Почему цепочки невозможно? Как и при перегрузке оператора '=', мы не можем цепеть, как A = B = C = D, если мы вернемся по значению. Зачем ?
Благодарим за ответы. Я понимаю, что я могу цепочки без возврата по ссылке, но мой вывод сильно отличается при перегрузке '='. Если я пишу:
class Blah{
public:
Blah();
Blah(int x, int y);
int x;
int y;
Blah operator =(Blah rhs);
};
Blah::Blah(){}
Blah::Blah(int xp, int yp){
x = xp;
y = yp;
}
Blah Blah::operator =(Blah rhs){
Blah ret;
ret.x = rhs.x;
ret.y = rhs.y;
return ret;
}
int main(){
Blah b1(2,3);
Blah b2(4,1);
Blah b3(8,9);
Blah b4(7,5);
b3 = b4 = b2 = b1;
cout << b3.x << ", " << b3.y << endl;
cout << b4.x << ", " << b4.y << endl;
cout << b2.x << ", " << b2.y << endl;
cout << b1.x << ", " << b1.y << endl;
return 0;
}
Выход из этого является: 8,9 7,5 4,1 2,3
Но если я перегрузить с возвратом по ссылке и установить параметр как ссылки, а также изменять и возвращать * это при перегрузке вместо этого, я получаю: 2,3 2,3 2,3 2,3
в чем причина объекты не изменяются в первом примере? Это из-за lvalues vs rvalues? Как насчет сокращенных операторов в сравнении?
ОК, другое обновление. Как уже упоминалось, правильный результат должен быть 2,3 для всех. Однако, если я напишу перегруженного оператора как:
Blah Blah::operator =(Blah rhs){
x = rhs.x;
y = rhs.y;
return *this;
}
Затем я получу правильные результаты. (2,3, 2,3, 2,3, 2,3). Что происходит с этим? Перегруженный оператор обновляет lhs с помощью rhs в функции перегрузки, но возвращает * это кажется бессмысленным. Где * это в итоге: b3 = b4 = b2 = b1? Попробует ли он вернуться влево, так что он фактически ничего не возвращает, когда цепочка достигает b3 (что будет пытаться вернуться влево)?
Потому что вы хотите продолжать вставлять в * тот же * поток. –