c++;模板的拷贝构造函数怎么不加参数化类型Ptr(Ptr<T> &_p) ?(在线)

来源:百度知道 编辑:UC知道 时间:2024/06/01 09:25:44
template <class T>class Ptr
{
T *p;
public:

////////////////////////////
//怎么下面不参数化类型也正确

Ptr(Ptr &_p):p(_p)
{
p->Upcount();
}
Ptr(T *_p):p(_p)
{
p->Upcount();
}
~Ptr()
{
p->Downcount();
}
operator T *()
{
return p;
}
T &operator*()
{
return *p;
}
T *operator->()
{
return p;
}

/////////////////////////
//下面这句换成operator=(Ptr &_p),也正确

Ptr& operator=(Ptr<T> &_p)
{
return operator=((T*)_p);
}
Ptr& operator=(T *_p)
{
p->Downcount();
p=_p;
_p->Upcount();
return *this;
}
};

书上说:
像Ptr<T>这样使用参数化的类取代多种一般类的主要好处是:这种方式是基于类型安全的,这种代码Ptr<T>使用在几乎任何T*可以使用的地方;

都在类里面,怎么也可以使用T*,都很安全啊?加与不加有什么区别,都能正确运行啊?

高手希望通俗的语言,多谢了

你把实现都写到定义里当然就不用像Ptr<T>这样写了。如果你把实现拿到定义的外面就必要像Ptr<T>这样写了。比如说operator=(Ptr &_p)拿到外面的话就应该写成这样:
Ptr<T>& Ptr<T>::operator=(Ptr<T> &_p)
{...}
其它函数都类似,如果这时候只写Ptr就会报错了。