对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类的作用了,就是在派生类能够正常定义对象,保证类中数据安全的前提下,禁止派生类编译器自动生成拷贝构造函数和拷贝赋值函数。

 

posted @ 2019-11-18 18:02  Let_Life_Stop  阅读(187)  评论(0编辑  收藏  举报