C++两种单例(饿汉式,懒汉式)-创新互联
#includeusing namespace std; class A{ public: static A& getInstance(void){ return s_instance; } private: A(int data=0):m_data(data){} A(A const& that); int m_data; static A s_instance; }; A A::s_instance(1234); int main(void){ A& a1 = A::getInstance(); A& a2 = A::getInstance(); cout << &a1 << ',' << &a2 << endl; return 0; }
这个是以静态成员作为单例的。
因为是单例,所以禁止创建其他A类对象,A a调用构造函数创建对象,所以将A类的构造函数放在
private里,A a = A::getInstance()调用拷贝构造函数创建对象,所以将拷贝构造函数放在private里
面,同时接口函数static A& getInstance(void),是静态的,如果是非静态的,那么怎么调用getInstance
函数呢,所以必须是静态的.
注意:静态成员对象s_instance是可以调用私有的构造函数的(我也不知道为什么).
2.懒汉式
#includeusing namespace std; class A{ public: static A& getInstance(void){ if(!s_instance){ s_instance = new A(1234); } return *s_instance; } void release(void){ if(s_counter && --s_counter==0){ delete this; s_instance = NULL; } } private: ~A(void){} A(int data = 0):m_data(data){} A(A const& that); int m_data; static int s_counter; static A* s_instance; }; int A::s_counter = 0; A* A::s_instance = NULL; int main(void){ A& a1 = A::getInstance(); A& a2 = A::getInstance(); cout << &a1 << ',' << &a1 << endl; a1.release(); a2.release(); return 0; }
这里是以静态成员指针作为单例,也没什么好说的了.
注意:静态成员指针s_instance,在new A(1234)时调用构造函数,但是在delete this时,是不会调用析够函数的,不管是公有的析构函数还是私有的析构函数(为什么不能调用析构函数我也不知道)
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
名称栏目:C++两种单例(饿汉式,懒汉式)-创新互联
分享网址:http://ybzwz.com/article/dioejc.html