效果:
- 内存中只能有一份对象,即类在内存中只能有1个实例(通过该类只能创建一个对象)
实现步骤:
- 将构造函数私有化。
- 在类中定义一个静态的指针变量(一般设为私有),并在类外初始化为空
- 定义一个返回值为类指针的静态成员函数,如果2中的指针对象为空,则初始化对象,以后再有对象调用该静态成员函数的时候,不再初始化对象,而是直接返回对象,保证类在内存中只有一个实例。
解释:
- 构造函数私有化是为了保证除了自己定义的类的静态方法(此文章中的
static Singleton * getInstance()
),其他方式均不能构造类的实例,间接保证类在内存中只有一个实例。
代码:
#include <iostream>
using std::cout;
using std::endl;
class Singleton
{
public:
static Singleton * getInstance()
{
if(nullptr==_pInstance) //若指针对象为空,则初始化对象
{
_pInstance=new Singleton();
}
return _pInstance;
}
static void destory()
{
if(_pInstance)
{
delete _pInstance;
}
}
void print()
{
cout << "data= " << _data << endl;
}
private:
Singleton() //构造函数私有化
: _data(0)
{
cout << "Singleton()" << endl;
}
~Singleton()
{
cout << "~Singleton()" << endl;
}
private:
int _data;
static Singleton *_pInstance; //静态指针变量
};
Singleton *Singleton::_pInstance=nullptr; //类外初始化静态指针变量
int main() //测试
{
Singleton *p1=Singleton::getInstance();
Singleton *p2=Singleton::getInstance();
cout<<"p1= "<<p1<<endl
<<"p2= "<<p2<<endl;
Singleton::destory();
return 0;
}
结果:
分析:
- 指针p1跟p2指向的内存空间地址相同,即整个内存中类的实例只有一个。
2021/1/13