設計乙個類的時候需要考慮的問題:
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,你的類需要定...
類設計者的核查表
核查表不是任務清單。它的用途是幫你回憶起可能會忘掉的事情,而不是約束你。下面的問題沒有確切的答案,關鍵是要提醒你思考他們,並確認你所做的事情是出於有意識的決定,而不是偶然行為。你的類需要乙個建構函式碼?基本上是 你的類成員是私有的嗎?你的類需要乙個無參的建構函式碼?是不是每個建構函式初始化所有資料成...
摘錄 類設計者的核查表
核查表並不是任務清單。它的用途是幫助你回憶起可能會忘掉的事情,而不是來約束你。如果只是盲目地按照核查表的要求按部就班地做,到頭來可能還是會忘記一些事情。知道了這一點之後,請看下面關於定義類時要弄清楚的一些問題。這些問題都沒有確切的答案,關鍵是要提醒你思考它們,並確認你所作的事情是出自於有意識的決定,...