1.为什么要阻止类对象的拷贝?

1)有些类,不需要拷贝和赋值运算符,如:IO类,以避免多个拷贝对象写入或读取相同的IO缓冲

2.如何阻止?

1)不定义拷贝构造函数和拷贝赋值运算符时,好心的编译器也会及时地学习雷锋好榜样帮你合成定义,即传说中的合成拷贝构造、合成拷贝赋值,所以这样阻止不了

2)c++11允许使用“=delete”将拷贝构造函数和拷贝赋值运算符定义为删除的函数,在函数参数列表后加上“=delete”即表明这个函数是删除的函数

3)删除的函数是一种这样的函数:我们虽然声明了它,但是不能使用它

4)"=delete"的主要用途是阻止类的拷贝赋值,但也可以指定给非拷贝控制成员

3.=delete和=default的区别

1)"=delete"必须出现在函数第一次声明的时候;而"=default"没有这个要求

2)语法上允许对任何函数都可以指定"=delete",不局限于类的成员函数,但一般情况下对析构函数不指定;而语法上只能对默认构造函数和五个拷贝控制成员使用"=default"

4.合成版本的拷贝成员函数可能被编译器定义为delete

1)某个数据成员的拷贝构造函数是删除的或不可访问的(private),则这个类的合成拷贝构造函数会被编译器定义为delete

2)某个数据成员的拷贝赋值运算符是删除的或不可访问的(private),或者类有一个const成员,或者类有一个引用成员,则这个类的合成拷拷贝赋值运算符会被编译器定义为delete

3)特殊情况:定义了一个移动构造函数或移动赋值运算符的必须也定义自己的拷贝成员函数,否则,它们被编译器合成的版本将为delete

4)规则总结:如果类的某个数据成员不能拷贝、赋值,则对应的合成版本的成员函数将被编译器定义为delete。

5.合成版本的构造/析构函数可能被编译器定义为delete

1)某个数据成员的析构函数是删除的或不可访问的(private),则这个类的合成析构函数会被编译器定义为delete

2)某个数据成员的析构函数是删除的或不可访问的(private),或者类有一个const成员却没有类内初始值,或者类有一个引用成员却没有类内初始值,则这个类的合成构造函数会被编译器定义为delete

6.合成版本的移动成员函数可能被编译器定义为delete

1)如果显式地用=default要求编译器生成合成移动操作,且编译器不能移动所有非static成员,则合成移动操作会被编译器定义为delete.

7.c++11以前detele的替代品

1)在c++11之前,类可以通过将其拷贝构造函数和拷贝赋值运算符声明为private来阻止拷贝,用户不能使用它们来拷贝对象,试图拷贝对象的代码在编译阶段将被标记为错误

 class A{
private:
A(const A&);
A& operator=(const A&);
//其他成员省略
};
 

=delete(c++11)的更多相关文章

  1. C++中的new与delete总结

    1. operator new.operator delete与new.delete操作符的区别: operator new的作用类似于malloc,负责分配内存:operator delete的作用 ...

  2. C++11 新特性总结

    前言 转载请注明出处,感谢! C++11 的新特性 1 变量和基本类型 1.1 long long 类型 扩展精度浮点数,10位有效数字 1.2 列表初始化 初始化的几种不同形式,其中用花括号来初始化 ...

  3. C++动态内存管理之深入探究new和delete

    C++中程序存储空间除栈空间和静态区外,每个程序还拥有一个内存池,这部分内存被称为自由空间(free store)或堆(heap).程序用堆来存储动态分配的对象,即,那些程序运行时分配的对象.动态对象 ...

  4. rsync同步时,删除目标目录比源目录多余文件的方法(--delete)

    在日常运维工作中,我们经常用到rsync这个同步神器.有时在同步两个目录时,会要求删除目标目录中比源目录多出的文件,这种情况下,就可用到rsync的--delete参数来实现这个需求了. 实例说明:在 ...

  5. C++11——引入的新关键字

    1.auto auto是旧关键字,在C++11之前,auto用来声明自动变量,表明变量存储在栈,很少使用.在C++11中被赋予了新的含义和作用,用于类型推断. auto关键字主要有两种用途:一是在变量 ...

  6. C++ 11 关键字

    1.auto 我现在用auto,基本是在变量定义时根据初始化表达式自动推断该变量的类型. 另外与关键字 decltype 连用,在声明或定义函数时作为函数返回值的占位符. auto不能用来声明函数的返 ...

  7. C#文件目录操作完全手册

    需要 using System.IO; 1) 相对路径转绝对路径string fullfolder = HttpContext.Current.Server.MapPath(folder); 2) 文 ...

  8. 2、C#面向对象:封装、继承、多态、String、集合、文件(上)

    面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...

  9. [转]REST简介

    转自:http://www.cnblogs.com/loveis715/p/4669091.html 一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的 ...

随机推荐

  1. 使用plsql进行查询的时候出现错误:动态执行表不可访问,本会话的自动统计被终止

  2. 【342】Linear Regression by Python

    Reference: 用scikit-learn和pandas学习线性回归 首先获取数据存储在 pandas.DataFrame 中,获取途径(CSV 文件.Numpy 创建) 将数据分成 X 和 y ...

  3. webpack前端模块加载工具

    最近在看许多React的资料,发现了大部分的项目都是用webpack行模块化管理的工具.这次也是借着写了一个React-Todos的小应用,对webPack最基本实用的功能体验了一番,顺带做个小记录. ...

  4. springboot 使用的配置

    1,控制台打印sql logging: level: com.sdyy.test.mapper: debug 2,开启驼峰命名 mybatis.configuration.map-underscore ...

  5. scala spark 调用hivecontext

    import org.apache.spark.rdd.RDD def save(data: RDD[ModelReplay], modelKey: String, dt: String): Unit ...

  6. codeblocks c++11 pthread

    支持c++11: setting->compiler-> 打上勾即可.(如果没有c++11,那么请更新codeblocks最新版.) pthread_create错误: 由于pthread ...

  7. 探讨 .NET 4 新增的 SortedSet 类

    http://www.cnblogs.com/WizardWu/archive/2010/06/17/1759297.html

  8. java程序员从ThinkPad到Mac的使用习惯改变

    https://blog.csdn.net/yczz/article/details/49993417

  9. 6-Qt给父widget加上styleSheet(添加背景图)而不改变子widget的styleSheet的方法

    Qt给父widget加上styleSheet(添加背景图)而不改变子widget的styleSheet的方法 比如用stylesheet给widget加背景图,可以用qt designer修改ui文件 ...

  10. linux下静默安装 weblogic12.2.1.3中间件

    第一步:准备需要的安装包文件,这里注意 weblogic12.2.*需要的最低JDK版本为1.8以上 1.查看当前的镜像列表:docker images 2.运行镜像,并进入容器,这里运行基本的cen ...