2012-05-07 48 views
0

我曾與它的過載輸出操作符下面的代碼:如果在重載輸出操作函數中使用cout會怎麼樣?

class Student 
{ 
public: 
    string name; 
    int age; 
    Student():name("abc"), age(20){} 
    friend ostream& operator<<(ostream&, const Student&); 
}; 
ostream& operator<<(ostream& os, const Student& s) 
{ 
    os << s.name; // Line 1 
    return os; 
} 

我想知道有什麼區別,如果我改變Line 1這個:cout << s.name

回答

4

然後operator <<會宣傳它可以輸出學生的姓名到任何流,但忽略其參數,並始終輸出到標準輸出。作爲一個比喻,它會類似於寫作

int multiplyByTwo(int number) { 
    return 4; 
} 

你可以看到,這絕對是一個問題。如果你真的想總是返回4,則函數應該已經

int multiplyTwoByTwo() { 
    return 4; 
} 

當然,你不能讓operator <<只取一個參數,因爲它是一個二元運算因此,這就是比喻壞了,但你得到的圖片。

2

它不會在os上撥打operator <<,而是撥打coutcout也是ostream,但不是唯一的一個。

例如,如果你想輸出到一個文件,你會有一個fstream。你寫

fstream fs; 
Student s; 
fs << s; 

輸出將不被打印到文件,但cout,這是不是你想要的。

這就像是說:「你可以輸出一個學生到你想要的任何ostream,它仍然會被打印到控制檯上。

+0

從技術上講,你可以重定向stdout去文件:) – chris