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