单例模式
1 当你希望资源不管谁用,都是一样的一份的时候;用单例模式
2 普通的类,构造,和析构是public的,因为你要new对象,new 要做的就是开辟空间,并调用构造;这个是一个针对公有函数的调用;(私有函数你在外边是看不到的)
3 单例模式就是 不管你get多少次,就一份;在程序中,能表示“仅有一份”的,还能用在类里边的 -> static;
4 如何保证每次创建都是同一个对象。首先绝对不能多次的new,也就不能有 "公有构造"
class A{ private: static A * a; //私有构造 A(){ }; //外边不能用new创建对象,因为构造函数是私有的,用new创建对象会编译报错
~A(); public: static A* getinstance() { //a是静态的就只有一个 if(a == null) { a= new A(); }//走到这里调用的构造函数 return a; } }
两种实现方法:
1 屎到屁股门再拉;懒汉模式;用的时候在初始化成员变量的实例
#include <iostream> #include <memory> using namespace std; class MyClass { private: MyClass() { printf("construct ........."); }; private: static MyClass *obj ; public: ~MyClass() {}; static MyClass* getinstance() { if (!obj) { obj = new MyClass(); } return obj; } }; MyClass* MyClass::obj = nullptr;//vs2015需要给类内静态成员变量初始化; int main() { void* obj = MyClass::getinstance(); return 0; }
在C++中,类的静态成员(static member)必须在类内声明,在类外初始化;因为这个初始化的值不需要每个实例一份,而是整个类只有一份;
2饿汉模式;创建类的时候就定义好成员变量的实例的值;
#include <iostream> #include <memory> using namespace std; class MyClass { private: MyClass() { printf("construct ........."); }; private: static MyClass *obj; public: ~MyClass() {}; static MyClass* getinstance() { printf("get instance----------"); return obj; } }; MyClass * MyClass::obj = new MyClass(); int main() {
int main()
{
void* obj = MyClass::getinstance();
void* obj2 = MyClass::getinstance();
return 0;
}
一次构造函数的调用,多次获取得到的是同一个实例;先在全局的位置调用了构造,之后每次getinstance得到的是同一个实例