2015-10-30 37 views
5

Cho một lớp học:Toán tử << overloading hoạt động như thế nào?

struct employee { 
    string name; 
    string ID; 
    string phone; 
    string department; 
}; 

Chức năng sau hoạt động như thế nào?

ostream &operator<<(ostream &s, employee &o) 
{ 
s << o.name << endl; 
s << "Emp#: " << o.ID << endl; 
s << "Dept: " << o.department << endl; 
s << "Phone: " << o.phone << endl; 

return s; 
} 

cout << e; sản xuất định dạng đầu ra cho employee e nhất định.

Ví dụ đầu ra:

Alex Johnson 
Emp#: 5719 
Dept: Repair 
Phone: 555-0174 

Tôi không thể hiểu làm thế nào các chức năng ostream hoạt động. Làm thế nào để nó có được tham số "ostream & s"? Làm thế nào nó quá tải toán tử "< <" và cách hoạt động của toán tử < <? Làm thế nào nó có thể được sử dụng để viết tất cả các thông tin về một nhân viên? Ai đó có thể vui lòng trả lời những câu hỏi này theo thuật ngữ của giáo dân không?

+2

nhà khai thác quá tải là đường chủ yếu chỉ là cú pháp cho một cuộc gọi chức năng, Khái niệm Ví dụ 'cout << * itr' tương đương với câu lệnh' operator << (cout, * itr) ', và trên thực tế, sử dụng cú pháp này hoạt động chính xác theo cùng một cách. – user657267

+2

Bạn đang beter off học những điều này từ một cuốn sách. –

+1

Lưu ý: Chữ ký của toán tử đầu ra quá tải sẽ là 'ostream & operator << (ostream & s, const employee & o)' và tất cả các hàm getter cũng phải là 'const', vì không có thay đổi trong' Employee 'instance. –

Trả lời

8

Điều này được gọi là độ phân giải quá tải. Bạn đã viết cout << *itr. Trình biên dịch lấy nó là operator<<(cout, *itr);, trong đó cout là một ví dụ nếu ostream*itr là một ví dụ của nhân viên. Bạn đã xác định hàm void operator<<(ostream&, employee&); khớp với gần nhất với cuộc gọi của bạn. Vì vậy, nó được thực hiện thông qua cout cho s*itr cho o

1

Với một employee e;. đoạn mã sau: cout << e;

sẽ gọi hàm quá tải của bạn và vượt qua tham chiếu đến coute.

ostream &operator<<(ostream &s, const employee &o) 
{ 
    // print the name of the employee e to cout 
    // (for our example parameters) 
    s << o.name << endl; 

    // ... 

    // return the stream itself, so multiple << can be chained 
    return s; 
} 

Sidenote: tham chiếu đến employee nên const, vì chúng ta không thay đổi nó, như đã chỉ ra bởi πάντα ῥεῖ

Các vấn đề liên quan