对mudo中noncopyable类的理解
假设,当前我们想禁止编译器自动生成构造函数和赋值函数
方法很简单,我们对这两个函数进行自定义就好了
如果我们想附加一个条件,在程序中避免使用类的调用构造函数和拷贝构造函数
也就是禁止如下情况产生:
class A; A t1, t2; t1.data = 10; t2 = t1; // 赋值函数
// 或者
A t2(t1); // 构造函数
这个时候,可以通过将构造函数和赋值函数的执行权限限制为private,防止进行调用
如下:
class A{ private: A(const A& a){...} A& operator= (const A& a){...} }
但是,有的友元类是可以访问到private中的成员函数的,为了保证安全,可以将定义改成声明
class A{ private: A(const A& a); A& operator= (const A& a); }
但是这样会报错,构造函数是无法合成了,但是连对象的生成都会报错
A t1;
解决办法是,在protected中或者public中定义构造函数
class A{ protected: A(){} ~A(){} private: A(const A& a); A& operator= (const A& a); };
现在,再贴一下noncopyable类的代码就很容易理解了
#pragma once // 表示只会编译一次 // class noncopyable{ protected: noncopyable(){} ~noncopyable(){} private: noncopyable(const noncopyable&); const noncopyable& operator=(const noncopyable&); };
我们就可以总结noncopyable类的作用了,就是在派生类能够正常定义对象,保证类中数据安全的前提下,禁止派生类编译器自动生成拷贝构造函数和拷贝赋值函数。