template <typename T>
class SmartPtr {
private:
T* ptr; // 指向实际对象的指针
int* refCount; // 引用计数
public:
// 构造函数
SmartPtr(T* p = nullptr) : ptr(p) {
if (ptr) {
refCount = new int(1);
} else {
refCount = new int(0);
}
}
// 复制构造函数
SmartPtr(const SmartPtr& other) : ptr(other.ptr), refCount(other.refCount) {
if (ptr) {
(*refCount)++;
}
}
// 赋值运算符重载
SmartPtr& operator=(const SmartPtr& other) {
if (this == &other) {
return *this;
}
if (ptr && --(*refCount) == 0) {
delete ptr;
delete refCount;
}
ptr = other.ptr;
refCount = other.refCount;
if (ptr) {
(*refCount)++;
}
return *this;
}
// 析构函数
~SmartPtr() {
if (ptr && --(*refCount) == 0) {
delete ptr;
delete refCount;
}
}
// 获取指向对象的指针
T* get() const {
return ptr;
}
// 解引用操作符重载
T& operator*() const {
return *ptr;
}
// 箭头操作符重载
T* operator->() const {
return ptr;
}
};
- 模板参数:
template <typename T>
定义了一个模板参数 T
,表示智能指针指向的对象类型。
- 私有成员:
T* ptr
:指向实际对象的指针。
int* refCount
:指向引用计数的指针,用于记录有多少个智能指针指向同一个对象。
- 构造函数:
SmartPtr(T* p = nullptr)
:初始化智能指针,若传入指针 p
,则分配一个新的引用计数并初始化为1;否则初始化为0。
- 复制构造函数:
SmartPtr(const SmartPtr& other)
:复制另一个智能指针,同时增加引用计数。
- 赋值运算符重载:
SmartPtr& operator=(const SmartPtr& other)
:首先检查自赋值,然后减少当前对象的引用计数并处理内存释放,再复制另一个智能指针并增加引用计数。
- 析构函数:
~SmartPtr()
:减少引用计数,当引用计数为0时,释放指向的对象和引用计数本身。
- 辅助函数:
T* get() const
:返回指向对象的指针。
T& operator*() const
:重载解引用操作符,返回指向对象的值。
T* operator->() const
:重载箭头操作符,用于访问对象的成员。