您的位置:首页 > 其它

简单实现智能指针

2014-11-22 13:30 316 查看
#ifndef _SMART_PTR_H
#define _SMART_PTR_H
template<class T>
class CSmartPtr
{
private:
T* m_pT;
public:
//构造函数
explicit CSmartPtr(T* p=NULL);
//~析构函数
~CSmartPtr();
T& operator*()const throw();
T* operator->()const throw();
T* get() const throw();
CSmartPtr<T>& operator =(const CSmartPtr<T>& s) throw();
void Reset(T* p);
T* Release() throw();
};

template<class T>
CSmartPtr<T>::CSmartPtr(T* p):m_pT(p)
{

}
template<class T>
CSmartPtr<T>::~CSmartPtr()
{
delete m_pT;
m_pT=NULL;
}
//解析地址(*)运算符重载
template<class T>
T& CSmartPtr<T>::operator*()const throw()
{
return *m_pT;
}
//成员访问(->)运算符重载
template<class T>
T* CSmartPtr<T>::operator->()const throw()
{
return m_pT;
}
//取得智能指针内部指针值
template<class T>
T* CSmartPtr<T>::get() const throw()
{
return m_pT;
}
//赋值运算符重载
template<class T>
CSmartPtr<T>& CSmartPtr<T>::operator =(const CSmartPtr<T>& s) throw()
{
if(m_pT!=s.get())
{
delete m_pT;//必须先清除原指针指向的内存
m_pT=s.get();
}
return *this;
}
//重置智能指针指向的对象
template<class T>
void CSmartPtr<T>::Reset(T* p)
{
if(m_pT!=p)
{
delete m_pT;
m_pT=p;
}
}
//传出智能指针内部指针值,并且智能指针放弃拥有权
template<class T>
T* CSmartPtr<T>::Release() throw()
{
T*p=m_pT;
m_pT=NULL;
return p;
}
#endif


异常规范(Exception Specifications)

throw后面规定了该函数允许抛出什么类型的异常,空表示不抛出任何异常。这样写函数声明后,你在实现GetMonth时就不能有任何throw语句。

如果写为 int GetMonth( ) const throw(string);

函数实现时可以抛出string对象,其它类型的对象不允许。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: