/*
智能指针:拷贝赋值构造析构
1、构造函数:可以默认构造(无参数),可以使用一个T指针构造,
2、拷贝函数:引用计数++
3、赋值构造:引用计数++
4、析构函数,判断是否为0
5、get:返回普通指针
6、重载-> 和&
*/
#include<bits/stdc++.h>
using namespace std;
template<typename T>
class Ptr{
public:
Ptr();//默认构造函数 指针为nullptr
Ptr(T* tt):t(tt),cnt(new int(1)){}
Ptr(const Ptr& p){//拷贝构造函数
if(p.cnt!=nullptr&&p.t!=nullptr){
(*(p.cnt))++;
cnt = p.cnt;
t =p.t;
}
}
Ptr& operator=(const Ptr& p){//赋值构造函数
if(--(*cnt) == 0){
delete cnt;
delete t;
}
if(p.cnt!=nullptr&&p.t!=nullptr){
(*(p.cnt))++;
cnt = p.cnt;
t =p.t;
}else{
cnt= t = p.cnt=p.t=nullptr;
}
return*this;
}
~Ptr(){//析构函数
if(cnt!=nullptr&&t!=nullptr){
(*cnt)--;
if(!(*cnt)){
delete t;
delete cnt;
}
}
}
T& operator*(){
return *t;
}
T* operator->(){
return this->t;
}
T* get(){
return t;
}
private:
int *cnt=nullptr;
T& t=nullptr;
};