Thắc Mắc Nạp Chồng Toán Tử Input/output C++ - Dạy Nhau Học

nói chính xác hơn là << và >> là toán tử dịch bit. Lão Stroustrup bị khùng nên lấy toán tử dịch bit đi làm input output cho stream.

<< và >> thì cũng như phép + hay -, có 2 phần tử tham gia: vế trái và vế phải. Viết 1 hàm cho toán tử có thể viết theo công thức <kiểu trả về> operator<toán tử>(<kiểu vế trái> <vế trái>, <kiểu vế phải> <vế phải>); ví dụ std::ostream& operator<<(std::ostream& out, const PhanSo& rhs); thì kiểu trả về là std::ostream& toán tử là << kiểu vế trái là std::ostream& (trùng với kiểu trả về) kiểu vế phải là const PhanSo&

thì khi sử dụng << trong câu lệnh std::cout << ps; vế trái là std::cout có kiểu kế thừa từ std::ostream nên có thể xem là std::ostream, vế phải là ps có kiểu là PhanSo được truyền const-reference vào << tức là truyền đích thị ps chứ ko tạo ra bản copy, vào bản chính truyền vào được xem như là 1 hằng.

vì sao kiểu trả về trùng với kiểu vế trái: để có thể viết như vầy: std::cout << ps1 << "\n"; Toán tử << được xét từ trái sang phải, tức là std::cout << ps1 << "\n"; được xét (std::cout << ps1) << "\n"; Như vậy kết quả trả về của (std::cout << ps1) sẽ là vế trái của toán tử << tiếp theo, vì vậy nên trả về trùng kiểu vế trái của toán tử trước nó.

phương thức (hàm của class) thì vế trái luôn luôn có kiểu là T* (T là tên của class) hoặc const T* nếu thêm const vào phía sau khai báo của phương thức. Tức là con trỏ this luôn được xem là vế trái của 1 phương thức trong class.

vì << là operator cho stream nên vế trái của nó ở đây là std::ostream chứ ko phải PhanSo, vì vậy phải viết hàm ko thuộc class. (hàm thuộc class gọi là phương thức, hàm ko thuộc class nào gọi là… hàm). Nhưng vì hàm nằm ngoài class ko thể truy cập các phần tử private của class (ở đây là tử số và mẫu số) nên lão Stroustrup chế ra cái keyword friend tức là hàm này có quyền truy cập các phần tử private của class thoải mái, miễn là có khai báo friend <khai báo hàm> trong class (bạn bè có quyền lục lọi đồ riêng tư của bạn bè? Chọn tên cũng khùng vãi :joy:)

vì friend đơn giản là phá hủy tính đóng gói (encapsulation), 1 trong các quy tắc của OOP, nên hạn chế xài friend.

Từ khóa » Toán Tử Istream