2012-03-28 7 views
5

Tôi nghĩ rằng đoạn mã sau có thể được sử dụng để tạo các thao tác.quá tải toán tử cho các thao tác

#include<iostream> 
ostream & symbol(ostream & output) 
{ 
    return output << "\tRs"; 
} 

hoạt động tốt. Các tuyên bố sau

cout << "Total amount: " << 567 << symbol; 

cung cấp cho các đầu ra

Total amount: 567 Rs 

Nhưng tôi không hiểu tại sao nó đang làm việc. Tôi có thông tin sau về quá tải toán tử trong C++.

  1. chỉ các toán tử hiện tại mới có thể bị quá tải. Không thể tạo toán tử mới. Nhưng biểu tượng không phải là toán tử hiện tại.

  2. Trong báo cáo kết quả (cout < < "Tổng số tiền:" < < biểu tượng;), có vẻ như < < là các nhà điều hành quá tải và biểu tượng là một biến/đối tượng. Nhưng tôi đã không khai báo biểu tượng làm biến/đối tượng.

  3. lý do tại sao họ sử dụng báo cáo trả lại (kết quả trả về < < "\ tRs";) ?. Tôi nghĩ rằng (trở lại "\ TRS";) hoặc (đầu ra < < "\ TRS";) nên làm việc (tôi đã cố gắng nhưng không làm việc :))

Thật sự tôi không biết. cách mã trên hoạt động. Có ai để giải thích làm việc của các nhà điều hành quá tải trên?

Trả lời

7

Bạn đang chuyển chức năng symbol cho nhà điều hành <<. Các << sẽ gọi chức năng đó trên ostream hiện tại (với các đối tượng ostream như tham số), do đó đạt được kết quả mà bạn nhìn thấy. (Phiên bản chính xác của << gọi là: ostream::operator<< (ostream& (*pf)(ostream&)); - xem reference để biết thêm)

Các kiểu trả về là ostream, cho phép chaining nhiều << 's. Bạn sẽ không cần nó về mặt kỹ thuật trong trường hợp cụ thể của bạn như là << có quyền truy cập vào luồng, nhưng điều này là để giữ cho nó phù hợp với các nhà khai thác (tôi nghĩ). Tất nhiên << yêu cầu tham số trả lại này, vì vậy bạn không có lựa chọn nào khác :)

+0

bạn có nghĩa là có tồn tại một toán tử quá tải 'được xác định trước' (ostream &, ostream & (*) (ostream &)) '? – Vlad

+1

'toán tử << (ostream & (* pf) (ostream &));' là một thành viên của ['std :: ostream] (http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/) – Attila

1

Có một hiện operator<< quá tải mà là thành viên của basic_ostream

basic_ostream& operator<<(basic_ostream& (*pf)(basic_ostream&)); 

Chữ ký phù hợp với chức năng của bạn (cũng như std::endl, std::flush, vv).