饿汉式
#include <iostream>
using 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.懒汉式
#include <iostream>
using 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时,是不会调用析够函数的,不管是公有的析构函数还是私有的析构函数(为什么不能调用析构函数我也不知道)
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。