c++面向對象筆記1:基於對象類的設計要點

一個典型的基於對象的類爲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);編譯器

  1. 兼容做爲左值, 能夠繼續拼接標準輸出動做, 須要把引用做爲返回值.編譯

  2. 按照c++標準輸出的習慣, ostream都是做爲第一個參數即:cout<<a;class

相關文章
相關標籤/搜索