很多情況下,對(duì)于一個(gè)類,要求當(dāng)前的程序中只能存在一個(gè)類的實(shí)例。例如一個(gè)程序只有一個(gè)數(shù)據(jù)庫(kù)的連接,或者只有一個(gè)網(wǎng)絡(luò)訪問(wèn)接口。
此時(shí),可以將類的構(gòu)造函數(shù)和析構(gòu)函數(shù)聲明為private.
class db_connent
{
private:
? ? ? ? ? db_connent();
? ? ? ? ? ~db_connent();
...............
}
由于在class外部不允許訪問(wèn)私有成員,因此,在class外部不能構(gòu)造新的對(duì)象,也不能析構(gòu)對(duì)象,否則將導(dǎo)致編譯出錯(cuò)。
在這種情況下,一般會(huì)有一個(gè)public的static成員函數(shù),給用戶提供調(diào)用的接口。static成員函數(shù)能夠訪問(wèn)到class的私有域,可以將類的對(duì)象構(gòu)造函數(shù)放進(jìn)去。
//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;
}
總結(jié)一下,把析構(gòu)函數(shù)定義為私有的,就阻止了用戶在類域外對(duì)析構(gòu)函數(shù)的使用。這表現(xiàn)在如下兩個(gè)方面:
1. ? 禁止用戶對(duì)此類型的變量進(jìn)行重復(fù)定義。
2. ? 禁止用戶在程序中使用 ? delete ? 刪除此類型對(duì)象。
在接口的設(shè)計(jì)層面上,防止了客戶對(duì)該類型對(duì)象的錯(cuò)誤操作。