继承noncopyable的类,不允许拷贝构造和赋值。省去了,每次手动把类的拷贝构造和赋值函数写在private下。
1 私有派生于noncopyable的类都不能复制和赋值
2 原理是:noncopyable内部禁止了赋值和复制。
3 该类可以被很好被复用,减少工作量,不用把想要禁止赋值和复制的类都自行定义私有的赋值和复制方法,只需从该类派生即可
头文件: #inlucde <boost/noncopyable.hpp>
class noncopyable { protected: noncopyable() {} ~noncopyable() {} private: // emphasize the following members are private noncopyable( const noncopyable& ); const noncopyable& operator=( const noncopyable& ); };
class noncopyable的基本思想是把构造函数和析构函数设置protected权限,这样子类可以调用,但是外面的类不能调用,那么当子类需要定义构造函数的时候不至于通不过编译。但是最关键的是noncopyable把拷贝构造函数和拷贝赋值函数做成了private的,继承自noncopyable的类在执行拷贝操作时会调用基类的拷贝操作,但是基类的拷贝操作是private的,因此无法调用,引发编译错误。但是当子类自己定义拷贝和赋值时,这样就可以使用了。
示例:
1 #include <iostream> 2 #include <boost/noncopyable.hpp> 3 using namespace std; 4 using namespace boost; 5 class A:public noncopyable 6 { 7 public: 8 A(int _id) 9 { 10 id=_id; 11 } 12 int print() 13 { 14 return id; 15 } 16 /* //自己定义A的构造函数就可以拷贝 17 A(const A& a) 18 { 19 this->id=a.id; 20 } 21 */ 22 private: 23 int id; 24 25 } 26 int main() 27 { 28 A ab(100); 29 cout<<ab.print()<<endl; 30 // A abc=ab; 31 //cout<<abc.print()<<endl; 32 33 }