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