類設計者的核查表

2021-06-07 00:16:32 字數 1555 閱讀 3406

設計乙個類的時候需要考慮的問題:

1、你的類是否需要乙個建構函式

2、你的資料成員是否私有化

使用函式返回私有資料成員的值,並且函式要使用const,說明私有資料成員不能被修改。

3、你的類是否需要乙個無參的建構函式

能否定義成陣列的形式

4、是不是每個建構函式初始化所有的資料成員

初始化時建構函式的主要任務

5、類是否需要析構函式

看類是夠使用了new,及是否分配了 資源

6、類是否需要乙個虛析構函式

struct b{

string s;

struct d:struct b

string t

int main()

b* dp = new d;

delete dp;

return 0;

delete dp這語句會呼叫錯誤的析構函式,因為沒有動態繫結,也就是沒有虛函式,他會呼叫b的析構函式,如果將b的析構函式定義成virtual的話,這個語句會呼叫d的析構函式

這裡的struct b應該要有乙個虛析構函式

struct b

string s;

virtual ~b()

7、類是否需要複製建構函式

複製該類的物件是否就是相當於copy類的資料成員和基類物件,如果是的話,就麼有必要,否則應該定義複製建構函式

例如:string類,儲存string的值是char*data,

當複製構造函式呼叫的時候,如果沒有定義,二者將指向共同的位址

8、類是否需要乙個賦值操作符

一般和7共同出現

9、類的賦值操作符能否正確的將物件賦給物件本身

string& string::operator=(string &other)

if(&other!=*this){

delete data;

data = new char[strlen(other.data)+1]

strcpy(data,other.data)             

return *this;    

return *this;

這個函式那個if語句主要的作用是保證能夠自己賦給自己的時候不會出現錯誤。

假設沒有if判斷,當出現自己賦值給自己的時候,delete語句會刪除資料,other.data的內容頁刪除。。。。

10、類是否需要定義關係操作符

可能需要排序或者是比較操作

11、刪除陣列時,時候使用了 delete

這一點是和c語言的malloc函式相容的同時關注效率。

12、在賦值操作符和複製建構函式的引數中加上const

因為二者的引數只是想當與複製,沒有修改的必要,並且繫結乙個非const引用到乙個臨時的物件時非法的,使用x::x(x&)作為複製建構函式,是不會允許任何特殊表示式的結果

13、如果函式有引用引數,他們應該是const引用嗎?

只有但函式想改變引數的值得時候,才不適用const,否則一般的情況下都需要加上const

因為右值不能夠複製給非const的引用變數上。

14、適當的宣告成員函式為const

類設計者的核查表

1,你的類需要乙個建構函式嗎?2,你的資料成員是私有的嗎?3,你的類需要乙個無參建構函式嗎?4,是不是每個建構函式初始化所有的資料成員嗎?5,類需要析構函式嗎?6,類需要乙個虛析構函式嗎?7,你的類需要複製建構函式嗎?8,你的類需要乙個賦值操作符嗎?9,你的類需要定義關係操作符嗎?10,你的類需要定...

類設計者的核查表

核查表不是任務清單。它的用途是幫你回憶起可能會忘掉的事情,而不是約束你。下面的問題沒有確切的答案,關鍵是要提醒你思考他們,並確認你所做的事情是出於有意識的決定,而不是偶然行為。你的類需要乙個建構函式碼?基本上是 你的類成員是私有的嗎?你的類需要乙個無參的建構函式碼?是不是每個建構函式初始化所有資料成...

摘錄 類設計者的核查表

核查表並不是任務清單。它的用途是幫助你回憶起可能會忘掉的事情,而不是來約束你。如果只是盲目地按照核查表的要求按部就班地做,到頭來可能還是會忘記一些事情。知道了這一點之後,請看下面關於定義類時要弄清楚的一些問題。這些問題都沒有確切的答案,關鍵是要提醒你思考它們,並確認你所作的事情是出自於有意識的決定,...