设为首页 加入收藏

TOP

4.8.6 解引用操作符
2013-10-07 15:01:35 来源: 作者: 【 】 浏览:70
Tags:4.8.6 引用 操作

4.8.6  解引用操作符

operators库使用dereferenceable提供了对解引用操作符*、->的支持,它的用法与之前介绍的算术操作符不太相同。

dereferenceable的类摘要如下:

  1. template <class T, class P, class B = ...> 
  2. struct dereferenceable : B  
  3. {  
  4.   P operator->() const;  
  5. };  

dereferenceable有三个模板参数:

第一个参数T是要实现operator->的子类,它的含义与算术操作符类相同;

第二个参数P是operator->所返回的类型,也就是指针类型,通常应该是T*;

最后一个参数B是用于基类链技术的父类,实际使用时我们不需要关心。

dereferenceable类要求子类提供operator*,会自动实现operator->。注意它的operator->函数的定义,不是如其他算术操作符类那样的友元函数,因此在使用dereferenceable时必须使用public继承,否则operator->将会成为类的私有成员函数,外界无法访问。

由于dereferenceable实现了解引用操作符的语义,因此它可以用于实现自定义的智能指针类,或者是实现代理模式,包装代理某些对象。

例如,下面的代码实现了一个简单的智能指针类my_smart_ptr,它public继承了dereferenceable,重载operator*并自动获得了operator->的定义:

  1. template<typename T> 
  2. class my_smart_ptr:   
  3.     public dereferenceable<my_smart_ptr<T>, T* >    //必须public继承  
  4. {  
  5.     T *p;                                           //内部保存的指针  
  6. public:  
  7.     my_smart_ptr(T *x):p(x){}                       //构造函数  
  8.     ~my_smart_ptr(){delete p;}                      //析构函数  
  9.     T& operator*() const                            //operator*定义,必须是常函数  
  10.     {       return *p;  }  
  11. };  

my_smart_ptr的用法就像是scoped_ptr:
  1. my_smart_ptr<string > p(new string("123"));  
  2. assert(p->size() == 3);  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇4.8.2 算术操作符的用法 下一篇4.7.3 为第三态更名

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: