歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++類設計者的核查表

C++類設計者的核查表

日期:2017/3/1 10:15:18   编辑:Linux編程

1. 類需要構造函數麼?

2. 數據是否需要保持私有的?

方案一 public: int length;

方案二 public: const int& length;//在構造函數中length = true_length;這樣由於是const變量,只能讀,不能修改。 private: int true_length;

方案三 public: int length() const;//

3. 是否需要一個無參的構造函數?

如果沒有無參的構造函數,那麼 Point p; Point pa[100]; 這樣的定義都是錯誤的。

4. 是不是每個構造函數初始化所有的數據成員?

構造函數的用途就是用一種明確定義的狀態來設置對象,而這個對象是由對象的數據成員反映的。因此每個構造函數都要負責為所有數據成員設置明確定義的值。(特殊的例外)

5. 是否需要析構函數?如果有內存是在類中new出來,但一直也沒有釋放的,需要在析構函數中釋放掉。

6. 是否需要虛析構函數?

如果一個基類B被派生了一個子類D,無論B是否有虛函數 B* d = new D(); delete d; //B都需要虛析構函數,否則這裡會調用錯誤的析構函數

7. 是否需要復制構造函數?

因為data的內存是另外動態分配的。所以應該需要析構函數來釋放data空間 class String{ public: String(); String(const char* s); private char* data } 因為data的內存是另外動態分配的。所以應該需要析構函數來釋放data的空間。同樣也需要復制構造函數,因為如果沒有的話,如果復制對象 String b = a 就是僅復制data的地址,b.data和a.data指象同一個內存,在兩個對象銷毀時,這個內存會被釋放兩次。如果不希望用戶能夠復制類的對象,就聲明復制構造函數(可能還有賦值操作符)為私有的 class Thing{ private Thing(const Thing&); Thing& operator=(const Thing&); }

8. 需要一個賦值操作符麼?

是否需要的理由和復制構造函數是一樣的。 Thing& operator=(const Thing&); 由return *this;結束以保證與內建的復制操作符一致。寫這個函數的時候還要注意賦值給自身的情況 String& String::operator=(const String& s) { delete[] data; //如果是賦值給自身的情況,s.data也給delete了,所有後面都是錯了 data = new char[strlen(s.data)+1]; strcpy(data,s.data); return *this; } 所以最好: String& String::operator=(const String& s) { if( &s != this){ delete[] data; data = new char[strlen(s.data)+1]; strcpy(data,s.data); return *this; } } 或: String& String::operator=(const String& s) { char* newdata = new char[strlen(s.data)+1]; strcpy(newdata,s.data); delete[] data; data = newdata; return *this; }

9. 需要定義關系操作符麼?

如果類邏輯上支持相等操作,那麼提供operate==,operate!=,就可能有好處如果類的值有某種排序關系,那就考慮其他 < > 等操作符

10. 刪除數據用delete[]了麼?

刪除數組是用delete[]是個好習慣。這種用法是為了與C兼容,實現時會有個地方記錄數組的長度

11. 記得在復制構造函數和賦值操作符的參數類型中加const了麼?

X::X(const X&) X::operator=(const X&)

12. 如果函數有引用參數,它們應該是const引用麼?

Complex operator+(const Complex& x,const Complex& y);

13. 記得適當地聲明成員函數為const了麼?

如果一個成員函數不會修改其對象(一般get方法),可以聲明它為const,這樣它才可以應用於const對象。例如:

int padded_length(const Vector& v,int n) { int k = v.length(); //由於v是const的,所以length()函數也需要定義成const,否則編譯不通過。 return k>n?k:n; }

Copyright © Linux教程網 All Rights Reserved