饿汉式



#include<iostream>usingnamespacestd;classA{public:staticA&getInstance(void){returns_instance;}private:A(intdata=0):m_data(data){}A(Aconst&that);intm_data;staticAs_instance;};AA::s_instance(1234);intmain(void){A&a1=A::getInstance();A&a2=A::getInstance();cout<<&a1<<','<<&a2<<endl;return0;}


这个是以静态成员作为单例的。

因为是单例,所以禁止创建其他A类对象,A a调用构造函数创建对象,所以将A类的构造函数放在

private里,A a = A::getInstance()调用拷贝构造函数创建对象,所以将拷贝构造函数放在private里

面,同时接口函数static A& getInstance(void),是静态的,如果是非静态的,那么怎么调用getInstance

函数呢,所以必须是静态的.

注意:静态成员对象s_instance是可以调用私有的构造函数的(我也不知道为什么).


2.懒汉式

#include<iostream>usingnamespacestd;classA{public:staticA&getInstance(void){if(!s_instance){s_instance=newA(1234);}return*s_instance;}voidrelease(void){if(s_counter&&--s_counter==0){deletethis;s_instance=NULL;}}private:~A(void){}A(intdata=0):m_data(data){}A(Aconst&that);intm_data;staticints_counter;staticA*s_instance;};intA::s_counter=0;A*A::s_instance=NULL;intmain(void){A&a1=A::getInstance();A&a2=A::getInstance();cout<<&a1<<','<<&a1<<endl;a1.release();a2.release();return0;}



这里是以静态成员指针作为单例,也没什么好说的了.

注意:静态成员指针s_instance,在new A(1234)时调用构造函数,但是在delete this时,是不会调用析够函数的,不管是公有的析构函数还是私有的析构函数(为什么不能调用析构函数我也不知道)