代码如下:

#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函数里面也要用引用接受或者叫绑定,不然就会通过拷贝构造函数产生拷贝,也就不是只有一份实例。