c 中的私有建構函式

2021-05-03 21:07:12 字數 962 閱讀 6796

一般建構函式不是私有或者保護成員,但建構函式可以使私有成員函式,在一些特殊的場合,會把建構函式定義為私有或者保護成員。

c++類的建構函式一般不應該是私有函式,因為私有函式不能被其他類或者全域性函式所使用。而建立c++例項需要呼叫建構函式。

所以如果建構函式是私有函式的話,除了類自己的方法之外,其他類不能構造這個類的例項。一般來說,類做出來就是讓其他類使用的,而使用乙個類必須先構造它的例項。所以一般情況下,建構函式如果是私有函式,其他類要使用它就很困難了。

但是,在一些特殊場合,比如不希望其他類能夠例項華裔各類,這種情況下會把建構函式定義為私有的或者保護的。

最常見的是單件,就是乙個類只有乙個例項,為了避免其他類建立多個例項,把建構函式定義為私有的:

class a

;a a::m_ins;

a & a::getinstance()

....

另外一種情況是,定義友元,這樣可以限制只有友元可以建立這個類的例項,其他類不能。

keyboard& keyboard::getinstance() 

整個程式有且只有乙個keyboard物件,getinstance函式就是為了得到這個唯一的物件。上面那段**是一種可能的實現手法。

為什麼要把getinstance宣告為static?

因為如果不宣告為static的話,外部必須要有乙個keyboard物件才能呼叫其getinstance函式。但是如果不呼叫getinstance函式,外部就無法獲得物件。這樣就形成了乙個死結。

宣告為static則沒有這個問題,可以直接根據類的名字(而不是類的物件)來呼叫getinstance函式。

如果getinstance函式不是static,必須像下面這樣呼叫:

keyboard kbd;

kbd.getinstance();

如果getinstance函式是static,可以像下面這樣呼叫:

keyboard::getinstance();

私有建構函式

通常我們都將建構函式的宣告置於public區段,假如我們將其放入private區段中會發生什麼樣的後果?我們知道,當我們在程式中宣告乙個物件時,編譯器呼叫建構函式 如果有的話 而這個呼叫將通常是外部的,也就是說它不屬於class物件本身的呼叫,假如建構函式是私有的,由於在class外部不允許訪問私有...

類的建構函式 私有屬性,私有屬性不 絕對 私有

建構函式及其他 class a def init self self.hour 0 self.minute 0 init 為類的建構函式,每次建立類物件時,都會執行建構函式。建構函式 init 會初始化類物件屬性,並且返回none。python類還可以定義其他的特殊方法,這些方法之前 之後都會有雙下...

C 中構造函式呼叫建構函式

include include using namespace std struct cls cls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,會按順序做2件事情 1 分配好記憶體 非靜態資料成員是未初始化的 2 ...