您的位置:首页 > 其它

Boost源码学习三[实用工具](1)

2015-12-01 14:57 357 查看
这一节是一些比较实用的小工具,功能单纯,代码也简单。

先学习的第一个就是noncopyable:

#ifndef BOOST_NONCOPYABLE_HPP_INCLUDED
#define BOOST_NONCOPYABLE_HPP_INCLUDED

namespace boost {

//  Private copy constructor and copy assignment ensure classes derived from
//  class noncopyable cannot be copied.

//  Contributed by Dave Abrahams

namespace noncopyable_  // protection from unintended ADL
{
  class noncopyable
  {
   protected:
      noncopyable() {}
      ~noncopyable() {}
   private:  // emphasize the following members are private
      noncopyable( const noncopyable& );
      const noncopyable& operator=( const noncopyable& );
  };
}

typedef noncopyable_::noncopyable noncopyable;

} // namespace boost

#endif  // BOOST_NONCOPYABLE_HPP_INCLUDED


第一个例子:

class noncopyable
  {
   protected:
      noncopyable()=default;//默认的构造函数和析构函数是保护的
      ~noncopyable()=default;//使用默认实现
   private:  // emphasize the following members are private;使用delete关键字禁止拷贝构造和拷贝赋值
      noncopyable( const noncopyable& )=delete;
      const noncopyable& operator=( const noncopyable& )=delete;
  };


第二个例子:

boost::noncopyable比较简单, 主要用于单例的情况.

通常情况下, 要写一个单例类就要在类的声明把它们的构造函数, 赋值函数, 析构函数, 复制构造函数隐藏到private或者protected之中, 每个类都这么做麻烦.

有noncopyable类, 只要让单例类直接继承noncopyable.

class noncopyable的基本思想是把构造函数和析构函数设置protected权限,这样子类可以调用,但是外面的类不能调用,那么当子类需要定义构造函数的时候不至于通不过编译。但是最关键的是noncopyable把复制构造函数和复制赋值函数做成了private,这就意味着除非子类定义自己的copy构造和赋值函数,否则在子类没有定义的情况下,外面的调用者是不能够通过赋值和copy构造等手段来产生一个新的子类对象的。

#include "tfun.h"

class myclass: public boost::noncopyable
{
public:
	myclass(){};
	myclass(int i){};
};

int main()
{
	myclass cl1();
	myclass cl2(1);

	// myclass cl3(cl1);	// error
	// myclass cl4(cl2);	// error

	return 0;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: