单例类:全程序中只有一个实例对象。
饿汉模式:在类加载的时候立刻进行实例化。演示代码如下:
#ifndef ANIAML_H
#define ANIAML_H
class animal
{
public:
animal(const animal& obj) = delete;//禁用拷贝构造函数
animal &operator=(const animal& obj) = delete; //禁用拷贝赋值操作符重载函数
static animal* getinstance()
{
return m_animal;
}
private:
animal();//构造函数私有化,防止外部生成多个实例对象
private:
static animal* m_animal;// 静态成员变量(全局只有一个)
};
animal* animal::m_animal = new animal;//静态成员变量,类内声明,类外实现
#endif // ANIAML_H
懒汉模式:在类加载的时候不去创建实例,只有当类使用的时候再去创建实例,在使用内存方面较饿汉模式占优势。
#ifndef ANIAML_H
#define ANIAML_H
class animal
{
public:
animal(const animal& obj) = delete;//禁用拷贝构造函数
animal &operator=(const animal& obj) = delete; //禁用拷贝赋值操作符重载函数
static animal* getinstance() //使用的时候,再实例化对象
{
if(m_animal == nullptr)//只生成一次
{
m_animal = new animal;
}
return m_animal;
}
private:
animal();//构造函数私有化,防止外部生成多个实例对象
private:
static animal* m_animal;// 静态成员变量(全局只有一个)
};
animal* animal::m_animal =nullptr;//静态成员变量,类内声明,类外赋空值
#endif // ANIAML_H
在使用内存方面,一般来说懒汉模式比饿汉模式好点。
在涉及到多线程时尽量使用饿汉模式,因为恶汉模式在没有调用化之前就生成了对象,多个线程使用该类时也是只有这一个对象;懒汉模式在多线程下同时调用getinstance()会生成多个实例对象。