cout是ostream類的對象,cin是istream類的對象。
我們平時用的cout<<就相當於cout.operator<<(...)。也就是說正常使用(不對operator<<進行函數重載,我們用的都是ostream類庫中本身定義好了cout對象的成員函數)
而當我們需要對cout<<進行重載時,比如我們定義了一個類Student,他的一個對象s1,我們想要cout<<s1,這時<<的意義就改變了,因此如果我們想按照我們自己的個性化需求來使用<<運算符,就需要對其進行重載,而重載分為重載為全局函數和引入為類的友元函數,由於我們是要通過cout這個iostream頭文件中定義的對象來調用operator<<這個函數,當我們cout<<一個自定義的對象時,編譯器在cout本身定義<<的那些基礎數據類型中找不到參數滿足我們需要的函數,這時有個全局函數的簽名滿足我們的需要,因此這個函數就是我們最終調用的函數,也就是我們重載<<運算符的函數。
ex:類的友元函數
ostream& operator<<(ostream& co,const Student& s) { co<<s.sname<<endl; return co; }
關於這個函數,有兩點值得注意:
(1)它的返回值,是這樣理解的:
cout<<5<<"hello";
在我們輸出了一個5以后返回的是調用第一個<<的對象的引用,即相當於第一個cout,我們就可以接着連續的用同一個cout來調用第二個<<函數了。
(2)之所以把全局函數以友元的形式引入class Complex中是因為在這個重載函數的實現過程中,我們往往需要引用實參對象中的一些非公有的對象,而這時就必要獲得權限,C++中的做法便是將其以友元的形式引入class Complex中。