随笔 - 21  文章 - 0  trackbacks - 0
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿

随笔分类

随笔档案

文章分类

搜索

  •  

最新评论

阅读排行榜

评论排行榜

最近使用boost noncopyable一点思考。
 
class noncopyable
  
{
   
protected:
      noncopyable() 
{}
      
~noncopyable() {}
   
private:  // emphasize the following members are private
      noncopyable( const noncopyable& );
      
const noncopyable& operator=const noncopyable& );
  }
;


上面拷贝构造函数和赋值构造函数都声明为private,这样不论什么派生方式,子类对此都是无权访问的,从而达到禁止拷贝的目的。

对于构造函数
为什么声明成protected呢?
首先肯定不能为private,不然无法构造子类实例。
如果为public,那么外部是可以创建noncopyable这么一个实例的,可是这个实例是完全没有意义的,该类只有在被继承之后才有意义。
所以此处声明为protected是非常恰当合适的,既保证外部无法直接构造一个无意义的noncopyable实例,又不影响构造子类实例。

分析可知,noncopyable act as 实现继承基类。

另外还有很常见的做法就是自己实现,即不通过noncopyable继承获取禁止拷贝的功能,而是将类的拷贝构造和赋值构造函数声明为private。

这两个方法还有个细微的差别,noncopyable 继承的子类对拷贝构造函数,赋值拷贝函数是没有访问权限的;而由类自身来实现禁止拷贝方法,类成员还是可以访问得到这两个函数的。

对于后一种方法,这两个函数只声明不去实现,即使类成员有权限访问的到(看似似乎要突破禁止拷贝的防线了),但是也会因为链接找不到实现而报错。




posted on 2014-08-12 09:31 pizzx 阅读(3833) 评论(0)  编辑 收藏 引用 所属分类: c++/boost

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理