C 類設計者的核查表 一

2021-10-06 20:47:29 字數 2150 閱讀 7430

核查表不是任務清單。它的用途是幫助你回憶起可能會忘掉的事情,比如飛行員核查表需要核查飛行過程中需要注意的事情,防止發生一些不必要的意外。下面是一些c++類的設計核查,這些問題並沒有乙個確切的答案,但是它會提醒你思考它們,並確定你做的事情是有意識的決定,而不是偶然事件。

template

<

typename t>

class

vector

;

如果類的設計者將向量的長度設定為乙個成員變數,那麼設計者就必須保證這個變數在任何時候都可以顯示向量的實際長度,因為不知道什麼時候會訪問這個資訊。另一方面,如果函式在類中是這樣實現的,比如:

template

<

typename t>

class

vector

;

這樣除非使用者呼叫,否則vector根本不必計算長度。這個思想就很重要了。

另外,使用函式而不是變數,在還允許讀取訪問的時候能夠容易的阻止寫入訪問。vector的第乙個版本根本沒有阻止使用者改變長度的措施。原則是length可以是乙個const int,但是如果建立後還要改變長度,就不能這樣做了。但是我們可以通過引用來只允許使用者進行讀取訪問:

template

<

typename t>

class

vector

;

這樣做確實可以防止以後出錯,但還是不如一開始直接用函式實現length方便。這樣使用者不可以改變length的值,所以會返回乙個實際值。

但是如果類的設計者希望使用者可以改變length的值,那將其設定為public也不是個好辦法,和複製vector的值一樣,改變長度大致上也需要手動分配和**記憶體。如果length是乙個使用者直接設定的變數,就無法迅速檢測到使用者的變化,所以對這種改變的檢測總是滯後的,很可能是在操作vector時才檢測到length的變化。但是使用成員函式改變length,每次改變時都會呼叫成員函式,這樣每次使用者改變length時設計者都可以察覺到。

如果有兩個操作length的函式,是不是應該使用set_length和get_length來對長度進行不同的操作,而且其返回值是void還是乙個值?或者返回乙個bool變數,是否操作成功?還是返回乙個值,變化前的值還是變化後的值?所以要規範自己的設計,對**可讀性有很大的影響。

如果乙個類已經有了建構函式,而你想讓你的類不必顯式的初始化它們,則必須顯式的寫乙個無參的建構函式——例如:

class

pointdemo

;//...

private

:int x, y;

};

這裡我們定義了乙個有建構函式的類。除非這個類有乙個不需要引數的建構函式,否則下面的語句就是非法的:

pointdemo p;
這裡沒有指出怎麼初始化p。此外,如果乙個類需要乙個顯示建構函式,比如上面的類,則試圖建立該類的物件陣列是非法的:

pointdemo p[

100];

即使你想把所有的物件都例項化,也要考慮所付出的代價。

建構函式的用途就是用一種明確定義的狀態來設定物件。物件的狀態由物件的資料成員進行反映。因此每個建構函式都需要負責為所有的資料成員設定經過定義的值。如果建構函式沒有做到這一點,就可能導致錯誤。

當然,這也不是完全正確的,比如類有一些資料成員,它們只在它們物件存在的一段時間有意義。

class

string

;

很明顯,它需要乙個析構函式,因為它的資料成員指向了必須由對應的物件釋放的被動態分配的記憶體。同理,它還需要乙個顯式的複製建構函式:沒有的話,複製string物件就會複製它的data成員的形式隱式的定義。複製完後,兩個物件的data成員將指向同樣的記憶體;當這兩個物件被銷毀時,這個記憶體會被釋放兩次。在拷貝建構函式時需要重新分配記憶體,而且在析構函式中需要加入判斷指標是否為空的判斷條件,使析構函式正確的釋放分配的資源。

當然,如果不希望使用者能夠複製類的物件,就宣告建構函式(可能還要賦值操作符)為私有的:

class

string

;

如果沒有其他的成員使用這些成員函式,如上宣告就夠了。沒有必要定義它們,因為沒人會呼叫它們,你不能,使用者也不能。

類設計者的核查表

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

類設計者的核查表

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

類設計者的核查表

設計乙個類的時候需要考慮的問題 1 你的類是否需要乙個建構函式 2 你的資料成員是否私有化 使用函式返回私有資料成員的值,並且函式要使用const,說明私有資料成員不能被修改。3 你的類是否需要乙個無參的建構函式 能否定義成陣列的形式 4 是不是每個建構函式初始化所有的資料成員 初始化時建構函式的主...