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. eclipse从svn导入maven项目变成普通项目解决办法

    右击项目-->configure-->Convert to Maven Project

  2. How to Pronounce INTERNATIONAL

    How to Pronounce INTERNATIONAL Share Tweet Share Tagged With: Dropped T How do you pronounce this lo ...

  3. 迷你MVVM框架 avalonjs 1.4.1发布

    以后有关avalon的版本升级消息,全部改放到这里 重构parseHTML,让其支持xhtml 强化 ms-duplex-number拦截器 添加data-duplex-number辅助指令 值为st ...

  4. 注册COM

    可以用代码在程序中实现COM的注册. 举例如下: (假设需要注册的文件为test.ocx)uses OLEctl,....varOCXHand: THandle;RegFunc: TDllRegist ...

  5. Group by 内部排序

    1.right join #  update_time  gid=>sid, group_status => s_table select a.* from comment as a ri ...

  6. fiddler 抓取 逍遥安卓模拟器 https包

    1.打开fiddler,进行相关设置 Tools--Fiddler Options 接下来进行客户端网络配置 1 查看电脑ip地址,ipconfig 逍遥游模拟器中使用自带的浏览器,访问192.168 ...

  7. HTTP Response Code 中文详解

      引自:https://blog.csdn.net/lplj717/article/details/70053560   1xx - 信息提示这些状态代码表示临时的响应.客户端在收到常规响应之前,应 ...

  8. Egit的merge合并冲突具体解决方法

    稍微总结下弄了半个下午的egit的merge合并冲突解决方法,网上看的都是一个模板出来的,看的糊里糊涂,花了很多时间去实验整个合并流程.. 前提工作 创建一个普通JAVA工程Test,创建一个类Tes ...

  9. java并发:volatile关键字

    java并发需要保证原子性,可见性,有序性. http://www.cnblogs.com/expiator/p/9226775.html 一.volatile关键字作用如下: 1.volatile关 ...

  10. MyBatis高级查询

    -------------------------siwuxie095 MyBatis 高级查询 1.MyBatis 作为一个 ORM 框架,也对 SQL 的高级查询做了支持, MyBatis 高级查 ...