代码如下:
#include <iostream> #include <memory> using namespace std; int g_constructNum = 0; int g_copyConstructNum = 0; int g_deleteNum = 0; class A { public: A() { std::cout << "construct: " << ++g_constructNum << std::endl; } A(const A& a) { std::cout << "copy construct: " << ++g_copyConstructNum << std::endl; } ~A() { std::cout << "destruct: " << ++g_deleteNum << std::endl; } static A& instance();//属于类而不属于某个对象 }; A& A::instance() { static std::shared_ptr<A> _instance;//保证每次执行instance函数只有一份_instance变量 if (_instance == nullptr) { _instance.reset(new A()); } return *_instance; } int main() { A &a = A::instance();//引用接受保证不执行拷贝构造函数 A &b = A::instance(); return 0; }
instance函数声明为static是表明是属于A类的,而不是某个对象或者一些对象的。从功能上看,instance函数是产生一个A类的实例,既然是单例,那么在函数里_instance变量前加上一个static,让其只有一份实例会保存,然后返回也是返回引用。智能指针的*号就是解引用。源码如下:
返回引用就是为了只保存一份实例,在main函数里面也要用引用接受或者叫绑定,不然就会通过拷贝构造函数产生拷贝,也就不是只有一份实例。