目录
一、关键点解析
1、final关键字
(1)、类禁止继承
C++11中允许将类标记为final,方法时直接在类名称后面使用关键字final,如此,意味着继承该类会导致编译错误。
(2)、虚函数禁止重写
C++中还允许将虚函数方法标记为fianal,这意味着无法再子类中重写该方法。
2、=delete关键字
禁止使用编译器默认生成的函数
3、父类
_Sp_counted_ptr类的父类为_Sp_counted_base(https://blog.csdn.net/kupepoem/article/details/119848082)
4、noexcept关键字
不抛出异常
5、explicit关键字
它的作用是表明该构造函数是显示的, 而非隐式的。
6、头文件
shared_ptr_base.h
二、代码分析
// Counted ptr with no deleter or allocator support
template<typename _Ptr, _Lock_policy _Lp>
class _Sp_counted_ptr final : public _Sp_counted_base<_Lp>
{
public:
explicit
_Sp_counted_ptr(_Ptr __p) noexcept
: _M_ptr(__p) { }
virtual void
_M_dispose() noexcept
{ delete _M_ptr; }
virtual void
_M_destroy() noexcept
{ delete this; }
virtual void*
_M_get_deleter(const std::type_info&) noexcept
{ return nullptr; }
_Sp_counted_ptr(const _Sp_counted_ptr&) = delete;
_Sp_counted_ptr& operator=(const _Sp_counted_ptr&) = delete;
private:
_Ptr _M_ptr;
};
template<>
inline void
_Sp_counted_ptr<nullptr_t, _S_single>::_M_dispose() noexcept { }
template<>
inline void
_Sp_counted_ptr<nullptr_t, _S_mutex>::_M_dispose() noexcept { }
template<>
inline void
_Sp_counted_ptr<nullptr_t, _S_atomic>::_M_dispose() noexcept { }