mình đang làm bài tập về nạp chồng toán tử ++ ( tiền tố hậu tố ) và dấu << của cout << để xuất ra màn hình kiểu dữ liệu của mình. code đã chạy tốt nhưng vẫn còn vài thắc mắc rất mong được giải đáp sau:

Code:
Fraction Fraction::operator++(int t)//++f postfix
{
	Fraction tmp(num, denom);
	num = num + denom;
	denom = denom*1;
	return tmp;
}

Fraction& Fraction::operator++()//f++ pretfix
{
	num = num + denom;
	denom = denom*1;
	return *this;
}


Code:
ostream &operator<<(ostream &os, const Fraction &x)
{
	os << " " << x.num << "/" << x.denom;
	return os;
}

istream &operator >> (istream &in, Fraction &x)
{
	//Get the numerator from user.
	cout<< "Num: ";
	in>>x.num;
	
	//Get the denominator from user.
	cout<< "Denom: ";
	in>>x.denom;
	
	return in;
}
tại sao phải truyền và tạo hàm theo kiểu pass by reference với &?
Nguyên tắc trả về của cout << là trả về num và denom của đối tượng x đã cập nhật nhưng khi chạy thì lại xuất ra giá trị cũ? code cout của mình xuất x.num và x.denom nhưng console lại xuất ra tmp là sao mình ko hiểu?

Rất mong được cao nhân chỉ giáo. Xin cảm ơn rất nhiều