很多情況下,對于一個類,要求當前的程序中只能存在一個類的實例。例如一個程序只有一個數據庫的連接,或者只有一個網絡訪問接口。
此時,可以將類的構造函數和析構函數聲明為private.
class db_connent
{
private:
? ? ? ? ? db_connent();
? ? ? ? ? ~db_connent();
...............
}
由于在class外部不允許訪問私有成員,因此,在class外部不能構造新的對象,也不能析構對象,否則將導致編譯出錯。
在這種情況下,一般會有一個public的static成員函數,給用戶提供調用的接口。static成員函數能夠訪問到class的私有域,可以將類的對象構造函數放進去。
//xxx.h文件
class db_connent
{
private:
db_connent();
~db_connent();
public:
static? db_connent*? instance();
private:
static? db_connent*? the_object;
}//xxxx.cpp文件
static? db_connent*? db_connent::the_object=NULL;
static? db_connent* db_connent::instance()
{
if(NULL==the_object)
? ? ? {
? ? ? the_object = new db_connent();
? ? ? if(NULL==the_object)
?????? return NULL;
? ? ? }
return the_object;
}
總結一下,把析構函數定義為私有的,就阻止了用戶在類域外對析構函數的使用。這表現在如下兩個方面:
1. ? 禁止用戶對此類型的變量進行重復定義。
2. ? 禁止用戶在程序中使用 ? delete ? 刪除此類型對象。
在接口的設計層面上,防止了客戶對該類型對象的錯誤操作。