30/09/2018, 17:28

Dấu & ở khai báo hàm có mục đích gì?

CHocsinh& CHocsinh::operator = (const CHocsinh &x)

Em đang học OOP và không hiểu các dấu & ở hàm trên có mục đích gì mong mấy anh chị giúp em giải thích ? ( em nghĩ nó là tham chiều nhưng cảm thấy kì kì nên em mạn phép lên đây hỏi )

viết 19:30 ngày 30/09/2018

đúng là tham chiếu rồi, kì ở chỗ nào?

viết là const CHocsinh &x hay const CHocsinh& x đều như nhau. Còn vì sao truyền tham chiếu thì nếu ko truyền tham chiếu thì nó tạo 1 bản copy rồi mới truyền bản copy này vào, cái này chắc thừa biết là ko cần thiết rồi.

Thai Hoc Nguyen viết 19:35 ngày 30/09/2018
CHocsinh& 

còn cái này sao anh nhỉ mặc dù trong hàm chả cần gì đến địa chỉ
VD thế này

  Fraction<T>& Fraction<T> :: operator + (const Fraction<T> &frac)
{
	Fraction<T> tmp;
	tmp.tu = tu * frac.mau + frac.tu * mau;
	tmp.mau = mau * frac.mau;

	return tmp;
}

Rõ ràng em thấy tmp không hề là địa chỉ mà Fraction vẫn ok . em nghĩ phải thế này return &tmp

viết 19:32 ngày 30/09/2018

return &tmp là return con trỏ rồi. Fraction<T>& là reference. Reference khác với con trỏ. Reference là trả về đích xác/chính chủ biến/giá trị nào đó. Ở đây operator+ thì ko trả về reference được, vì tmp là biến tạm thời, nếu trả về đúng tmp thì sau khi kết thúc hàm operator+ thì tmp sẽ bị xóa, object trả về cũng mất luôn. Bắt buộc trả về bản copy của tmp. Sửa lại giá trị trả về là Fraction<T> hoặc kỹ hơn là const Fraction<T>. Tuy nói là bản copy nhưng trình biên dịch sẽ tối ưu hóa code dùm mình trả về đúng tmp luôn, ko phải trả về bản copy của tmp.

còn với operator+= thì mới phải trả về reference. Reference ở đây chính là object trong vế trái của operator+=. Vd gọi a += b += c thì += được đánh giá từ phải sang trái: tính b += c trước, trả về đích thị b, sau đó đánh giá a += b (b lúc này đã được công thêm c), rồi trả về đích thị a.

template <typename T>
Fraction<T>& Fraction<T> :: operator += (const Fraction<T> &rhs) //rhs = right hand side = vế phải.
{
  tu = tu * rhs.mau + rhs.tu * mau;
  mau *= rhs.mau;
  return *this; //this là con trỏ tới object nằm bên vế trái => *this là vế trái 
}

operator+= rồi thì viết operator+ dễ:

template <typename T>
const Fraction<T> Fraction<T> :: operator + (const Fraction<T> &rhs)const
{
  Fraction<T> tmp = *this;
  return tmp += rhs; //xài operator+=, vì += trả về đích thị tmp nên return luôn, khỏi mất công viết 2 dòng: tmp += rhs rồi mới return tmp
}
Bài liên quan
0