C++之保護和私有構造函數與析構函數

1、構造函數html

一、保護函數

構造函數定義爲protected後,就意味着你不能在類的外部構造對象了,而只能在外部構造該類的子類的對象,好比:this

class Basehtm

{對象

protected:blog

Base() {}繼承

...get

};class

class Derived : public Base變量

{

public:

Derived() {}

...

};

Base b; //error

Derived d; //ok

二、私有

構造函數定義爲private後,意味着不單單不能在類的外部構造對象了,並且也不能在外部構造該類的子類的對象了,只能經過類的static靜態函數來訪問類的內部定義的對象,單件singleton模式就是私有構造函數的典型實例:

class CLog

{

private:

CLog() {};

public:

~CLog() {};

public:

static CLog* GetInstance()

{

if (NULL == m_sopLogInstance)

{

CLock oInstanceLock;

oInstanceLock.Lock();

if (NULL == m_sopLogInstance)

{

m_sopLogInstance = new CLog();

}

oInstanceLock.Unlock();

}

return m_sopLogInstance;

}

...

private:

static CLog *m_sopLogInstance;

...

};

CLog &log = CLog::GetInstance();

三、拷貝構造和賦值操做符

拷貝構造和賦值操做符定義爲私有後,意味着禁止在外部對類的對象進行復制操做。這種狀況的典型應用是類的成員中含有鎖成員變量時,禁止拷貝構造和賦值操做能夠防止對象被拷貝後,拷貝的對象進行加鎖後影響到原有對象加鎖,從而違背碼農意願。


2、析構函數

對於堆中的對象,一般都是用new/delete來建立/銷燬,當調用new時,它會自動調用相應類的構造函數,當調用delete時,它會自動調用相應類的析構函數。而在棧中產生對象時,對象的建立/銷燬是自動完成的,也就是在建立時自動調用構造函數,在銷燬時自動調用析構函數,即不須要顯示調用new/delete,但有個前提是類的構造/析構函數都必須是public的。

析構函數不管是protected仍是priavte,其共同做用都是禁止在棧中產生對象,由於沒法自動完成析構函數的調用,天然就不能在棧中建立對象了;固然若是在堆上建立對象時,也不能直接delete對象了,由於這樣也會在外部析構該對象,可是能夠間接完成堆對象的析構,好比:

class Base

{

public:

Base() {}

private:

~Base() {}

public:

void Destroy() {delete this;}

};

爲擁有私有或保護析構函數的類建立一個公有的Destroy函數來銷燬對象便可。

那私有和保護析構函數有什麼區別呢?區別在於私有的析構函數不只禁止了棧中產生對象,並且同時也禁止了繼承,下手也忒狠了了點,若是你不想太狠而不想限制繼承,那就用保護的析構函數吧。


C++之保護和私有構造函數與析構函數

相關文章
相關標籤/搜索