1、阻止拷贝的原因:对于某些类来说,拷贝构造函数和拷贝赋值运算符没有意义。举例:iostream类阻止了拷贝,以避免多个对象写入或者读取相同的IO缓冲。
 
2、阻止拷贝的方法有两个:新标准中可以将成员函数定义成删除的函数;在旧标准中可以使用private进行拷贝控制,只声明不定义。推荐使用第一种。
 
3、删除的函数:对函数进行了声明,但是不能以任何方式使用它们,通过在函数参数列表后面加上=delete来将函数定义成删除的。=delete必须出现在函数第一次声明的地方。
struct NoCopy{
NoCopy()=default;
NoCopy(const NoCopy&)=delete;
NoCopy& operator=(const NoCopy&)=delete;
};
4、析构函数是不能够删除的成员。因为把析构函数删除之后,就不能把定义的成员和对象删除了;但是可以使用指针动态分配这种类型的对象,不过不能释放指针资源。也就是说,对于析构函数已经删除的类型,不能定义该类型的对象或者不能释放指向该类型的动态分配对象的指针。
 
5、如果没有定义拷贝控制成员,对于某些类来说,编译器合成的拷贝控制成员也可能是删除的。如果一个类有数据成员不能够默认构造、拷贝、赋值或者销毁,那么对应的成员函数就是删除的。也就是类成员的性质会对其他成员函数造成影响。具体说来就是:
    
    1)如果一个类的析构函数是删除的或者不可访问的,那么默认和拷贝构造函数是删除的,这样规定是为了防止创建对象,导致无法删除。
    2)如果有引用类型或者const类型成员导致无法进行赋值操作,那么拷贝构造函数和拷贝赋值运算符就是删除的,因为需要赋值操作,而这两种类型不能被赋值。
    除了类本身的因素之外,类成员如果是一个类类型。那么这个类类型成员的操作性质也会影响这个类的性质(例如类中有一个string类型成员,那么这个类的操作也受到string类的影响)
    3)如果成员的拷贝赋值运算符是删除的,或者有引用或者const类型,那么类的合成拷贝赋值运算符定义为删除的。因为不能对这个成员进行赋值操作。
    4)如果成员的析构函数是删除的,或者没有类内初始化器,那么类的默认构造函数是删除的,因为这个成员无法创建和无法销毁。

最新文章

  1. 页面中调用系统常用的对话框需要用到的classid
  2. 【NEUQACM OJ】1018: A+B again
  3. 难道这就是JavaScript中的"闭包"
  4. Cocos2d-X3.0 刨根问底(五)----- Node类及显示对象列表源码分析
  5. Javascript 中的false、0、null、undefined和空字符串对象
  6. uva247 - Calling Circles(传递闭包+DFS)
  7. Random获得的随机数怎么样减少重复率
  8. RANSAC - 随机采样一致性算法
  9. python--Selectors模块/队列
  10. js术语扫盲贴:XHR、RegExp、call-apply、prototype
  11. 【ASP.NET】Validation 服务器控件
  12. dubbo could not get local host ip address will use 127.0.0.1 instead 异常处理
  13. ThreadPoolExecutor源码解读
  14. picker(级联)组件及组件封装经验
  15. 洛谷P4172 [WC2006]水管局长 (LCT,最小生成树)
  16. OpenGL tutorial资源在mac yosemite下的cmake生成工程问题
  17. 使用maven项目 转XSD、 WSDL 成Java类
  18. mongodb 连接字符串
  19. NB-IOT移植移动onenet基础通信套件之Object_ID,实例ID,资源ID
  20. C#学习基础(1)命名约定

热门文章

  1. vue路由传参的三种方式以及解决vue路由传参页面刷新参数丢失问题
  2. MySQL-InnoDB锁(二)
  3. jmeter+ant生成xml报告
  4. 2019强网杯babybank wp及浅析
  5. Http协议4个新的http状态码:428、429、431、511;
  6. C#数据结构_栈和队列
  7. Asp.net MVC 集成AD域认证
  8. centos7安装使用docker-tomcat-mysql
  9. Netty源码分析 (三)----- 服务端启动源码分析
  10. [Error]Win8安装程序出现2502、2503错误解决方法