智能指针代码:

// 引用计数器类 用于存储指向同一对象的指针数
template<typename T>
class Counter
{
private:
	// 数据成员
	T* ptr;    // 对象指针
	int cnt;   // 引用计数器
	// 友元类声明
	template<typename T>
	friend class SmartPtr;
	// 成员函数
	// 构造函数
	Counter(T* p)   // p为指向动态分配对象的指针
	{
		ptr = p;
		cnt = 1;
	}
	// 析构函数
	~Counter()
	{
		delete ptr;
	}
};

// 智能指针类 
template<typename T>
class SmartPtr
{
private:
	// 数据成员
	T* ptr;
	Counter<T>* ptr_cnt;

public:
	// 普通构造函数 初始化计数类
	SmartPtr(T* p) : ptr(p), ptr_cnt(new Counter<T>(p))
	{
	}
	// 拷贝构造函数
	SmartPtr(const SmartPtr& other) : ptr(other.ptr), ptr_cnt(other.ptr_cnt)
	{
		ptr_cnt->cnt++;
	}
	// 移动构造函数
	SmartPtr(SmartPtr&& other) : ptr(std::move(other.ptr)), ptr_cnt(std::move(other.ptr_cnt))
	{
		other.ptr_cnt = nullptr;
	}

	// 赋值重载
	SmartPtr& operator=(const SmartPtr& rhs)
	{
		if (ptr_cnt != rhs.ptr_cnt)
		{
			if (ptr_cnt != nullptr)
			{
				ptr_cnt->cnt--;
				if (ptr_cnt->cnt == 0)
					delete ptr_cnt;
			}
			ptr = rhs.ptr;
			ptr_cnt = rhs.ptr_cnt;
			rhs.ptr_cnt->cnt++;

		}
		return *this;
	}

	// 移动赋值重载 
	SmartPtr& operator=(SmartPtr && rhs)
	{
		if (ptr_cnt != rhs.ptr_cnt)
		{
			std::swap(this, rhs);
		}
		return *this;
	}

	// 析构函数
	~SmartPtr()
	{
		if (ptr_cnt != nullptr)
		{
			ptr_cnt->cnt--;
			if (ptr_cnt->cnt == 0)
				delete ptr_cnt;
		}
	}

	T& operator*()     const { return *(ptr); }
	T* operator&()     const { return ptr; }
	size_t use_count() const { return ptr_cnt->cnt; }
	bool unique()      const { return (ptr_cnt->cnt == 1); }
	T* get()           const { return ptr; }
};

测试代码:

class test
{
public:
	int n;
	test(int i) :n(i)
	{
		std::cout << "c " << n << std::endl;
	}
	~test()
	{
		std::cout << "d " << n << std::endl;
	}
};

int main(int argc, char** argv) {
	SmartPtr<test> p1 = new test(1);//构造
	std::cout << p1.use_count() << std::endl; //1?
	SmartPtr<test> p2 = p1;//复制构造
	std::cout << p1.use_count() << std::endl;//2?
	std::cout << p1.get()->n << p2.get()->n << std::endl;//11?
	SmartPtr<test> p3(std::move(p2));//移动构造
	std::cout << p1.use_count() << std::endl;//2?
	SmartPtr<test> p4 = new test(2);
	p3 = p4;//赋值
	std::cout << p4.use_count() << p1.use_count() << std::endl;//21?

	return 0;
}

测试结果: