关于operator关键字那点事儿

C++中,operator 关键字的作用有两点:

1.操作符重载。

2.对象类型的隐式转换。


这两种作用都比较好理解。

下面主要介绍,利用“作用2”在解决 “Testing Smart Pointers for Nullness” 。 


为了实现  智能指针的 ptn == 0 || ptn!=0) || ptn || !ptn, 判断,需要将智能指针隐式转换成bool.

总结下,常见有4种实现方法:

  1. operator bool() {...} 
  2. operator const void*() {...}
  3. typedef T* (CLASS::*CLASSMEMFUNPT) ();    operator CLASSMEMFUNPT() {...}
  4. 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。


posted @ 2012-10-19 16:12  林间走寸  阅读(212)  评论(0编辑  收藏  举报