我估計是要重載流輸出運算符<<,好比cout<<a;原來的形式是 operator<<(cout,a); 因爲<<須要用到兩個類,一個是ostream類,cout就是他的對象,是負責輸出的類;另外一個是用戶自定義類。ios
因此重載是應該用 友元函數 重載。以下:c++
1函數 2spa 3指針 4code 5對象 6ci 7編譯器 8io 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
注意上面的ostream& operator<<(ostream& out,const Date& date)的3個引用&,
1. 第一個ostream&,返回的是ostream類對象的引用,爲了進行連續的運算,如cout<<a<<b;
先進行cout<<a,運算玩了,返回cout的引用,就是返回了cout自己,原來的式子變爲cout<<b;
這樣就能連續寫了,cout<<a<<b<<c<<........
2. 第二個ostream& out, out是隨便取的名字,就是ostream類的對象,與cout用法同樣,經過<<將數據傳到out裏,因此輸出時用cout<<a,這時就調用 operator<<(cout,a), 把cout做爲參數傳入。對於上述例子cout<<date<<endl;,就是執行了cout<<date.year<<'-'<<date.month<<'-'<<date.day; return cout;(注意,這裏就是cout,其中year等是基本類型,c++已經寫好了)
再次說明cout並不特殊,就是預先定義好了的ostream類的對象。
3. 第三個const Date&,主要爲了快速出入參數,若是不用&,將會複製一個參數,而不是將原來的對象直接傳入,就會調用拷貝構造函數(若是沒寫的話編譯器自動提供),浪費時間,有時還會產生錯誤,好比數據成員裏有指針時,編譯器提供的拷貝構造函數將會自動複製 一個指針,與原來的指針指向同一個地址,這樣改變一個另外一個也會改變,這是咱們不想要的,咱們須要拷貝時指針指向不一樣的地址,兩個對象互不干擾,只是指針所指變量的值相等就行,這就須要本身寫 拷貝構造函數,本身new等。 因此通常用&,加const防止意外修改。