对象基础函数及变量书写注意事项¶
总结一下下
私有变量¶
- 指针:尽量放在私有变量,防止外部修改
template<typename T>
class SharedPtr
{
private:
T* _ptr;
size_t* count;
}
构造函数¶
- explcit: 防止不必要的隐式转换
- 默认值:指针可设置 nullptr
- 初值化:给成员变量赋值
class ShardPtr { explcit SharedPtr(T* ptr = nullptr):ptr(_ptr),count_(ptr? new size_t(1):nullptr); }
拷贝构造¶
- 常量形参+对象引用:拒绝修改传入的对象
- 初值化:将传入对象的成员变量赋值给当前变量,注意私有变量作用域可以适用于同类型对象
SharedPtr(const SharedPtr& other):ptr_(other),count_(other.count_) { if(count_) ++count_; }
拷贝赋值(赋值操作符)¶
- 返回值:为当前对象的引用
- 常量形参+对象引用:拒绝修改传入的对象
- 自检:不是自己就删除(释放内存),是的话就直接返回自己 this
- 赋值:自检成功释放完内存就赋值
SharedPtr& operator=(const SharedPtr& other) { if(this != other){ release(); ptr_ = other.ptr_; count_ = other.ptr_; if(count_) { count_++; } } return this; }
析构函数¶
- 虚函数:注意带虚继承的类需要给析构加上虚函数
- 检测空指针: 防止 delete nullptr
- 删除内存:根据情况选择是否 delete 或 delete[]释放内存
- delete this 问题:报错/无限递归/虚函数,成员释放
~SharePtr(){ if (count_ && --(*count_) == 0) { delete ptr_; delete count_; } }