一個典型的基於對象的類爲complex
, 類的實現不須要指針且只由c++的內置類型組成,
對於這種類的設計要點注意事項就拿complex
的實現做爲例子, 部分代碼以下:c++
4 class complex 5 { 6 public: 7 complex (double r=0, double i=0) : re(r), im(i) {} 8 //complex (){}; 9 complex & operator += (const complex &); 10 double real () const { return re;} 11 double imag () const { return im;} 12 13 private: 14 double re, im; 15 16 friend complex& __doapl(complex *, const complex &); 17 };
其中構造函數complex(){}
雖然和第七行的構造函數會生成不符號名(函數入參也是構成簽名),
分別解析輸出的二進制文件,找到二者的符號分別是:函數
_ZN7complexC2Edd // complex(double, double) _ZN7complexC2Ev // complex()
所以,當程序中未使用此構造函數的時候不會由於命名衝突而報錯, 而當代碼中作以下定義:設計
complex a;
會產生歧義, 編譯器不知道使用哪一個構造函數而報錯. 所以, 類設計的時候就不要聲明,
保留覆蓋範圍更廣的complex(double, double)
構造函數便可.指針
那麼有一個疑問, 爲了保證類後續的維護者不會新增這個無效的complex()
構造函數,
可不能夠把它直接放到private裏面去呢? 不能夠的, 用gcc試驗的結果是, 編譯器會先
遍歷匹配函數, 找到了以後再判斷函數的可見性, 公有的仍是私有的, 因此放private並沒啥用code
以operator <<
爲例, 實際上用途就兩種, 或者執行完<<
以後還能做爲左值, 或者不做爲左值
基於如下兩點考慮, 輸出操做符重載函數應該做爲類的非成員函數, 聲明形式以下:對象
ostream &operator << (ostream &os, const complex &x);編譯器
兼容做爲左值, 能夠繼續拼接標準輸出動做, 須要把引用做爲返回值.編譯
按照c++標準輸出的習慣, ostream
都是做爲第一個參數即:cout<<a;
class