#include <bits/stdc++.h>
using namespace std;
class Count {
private:
    int cnt;
public:
    Count() :cnt(1) {}
    ~Count() = default;
    void addcount() { ++cnt; }
    int getcount() { return cnt; }
    int reducecount() { return --cnt; }
};
template <typename T>
class Shared_ptr {
private:
    T* ptr;
    Count* cnt;
public:
    //构造函数
    Shared_ptr(T* pt = nullptr) : ptr(pt) {
        if (pt)
            cnt = new Count();
    }
    //析构函数
    ~Shared_ptr() {
        if (ptr && !cnt -> reducecount()) {
            delete ptr;
            delete cnt;
        }
    }
    //拷贝构造函数
    Shared_ptr(Shared_ptr<T>& sptr) {
        ptr = sptr.ptr;
        if (ptr) {
            cnt = sptr.cnt;
            cnt -> addcount();
        }
    }
    //移动构造函数
    Shared_ptr(Shared_ptr<T>&& sptr) {
        ptr = sptr.ptr;
        if (ptr) {
            cnt = sptr.cnt;
            sptr.ptr = nullptr;
            sptr.cnt = nullptr;
        }
    }
    //拷贝构造运算符
    Shared_ptr& operator=(Shared_ptr& sptr) {
        ptr = sptr.ptr;
        if (ptr) {
            cnt = sptr.cnt;
            cnt -> addcount();
        }
        return *this;
    }
    Shared_ptr& operator=(Shared_ptr<T>&& sptr) {
        ptr = sptr.ptr;
        if (ptr) {
            cnt = sptr.cnt;
            sptr.ptr = nullptr;
            sptr.cnt = nullptr;
        }
        return *this;
    }
    long use_count() {
        if (ptr)
            return cnt -> getcount();
        return 0;
    }
};
int main() {
    Shared_ptr<int> p1(new int(10));
    cout << p1.use_count() << endl;
    Shared_ptr<int> p2(p1);
    cout << p2.use_count() << endl;
    return 0;
}