C++中,operator 关键字的作用有两点:
1.操作符重载。
2.对象类型的隐式转换。
这两种作用都比较好理解。
下面主要介绍,利用“作用2”在解决 “Testing Smart Pointers for Nullness” 。
为了实现 智能指针的 ptn == 0 || ptn!=0) || ptn || !ptn, 判断,需要将智能指针隐式转换成bool.
总结下,常见有4种实现方法:
- operator bool() {...}
- operator const void*() {...}
- typedef T* (CLASS::*CLASSMEMFUNPT) (); operator CLASSMEMFUNPT() {...}
- typedef T* CLASS::*CLASSMEM; operator CLASSMEM() {...}
方法1,bool类型会(轻易地)转化为int,long等类型。
方法2,void*
可以在外部被delete掉。
方法3,4 是boost里面普遍使用的方法。 相对较好。
下面给出一个boost风格的智能指针的代码片段
template<class T> class KinAutoPtr // noncopyable
{
private:
T * px;
KinAutoPtr(KinAutoPtr const & );
KinAutoPtr & operator=(KinAutoPtr const &);
typedef KinAutoPtr<T> this_type;
public:
typedef T element_type;
typedef T * this_type::*unspecified_bool_type;
explicit KinAutoPtr( T * p = 0 ): px( p ) // never throws
{
}
operator unspecified_bool_type() const // never throws
{
//这里其实只要返回一个非0的this_type空间内的指针
return px == 0? 0: &this_type::px;
}
};
另外,如果cpp文件里有多个隐式转换会如何呢?
在vc9上试验了下, 如果有operator unspecified_bool_type() 和 operator bool(),无论代码先后顺序,始终执行的是operator bool。