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. selector 模块

    selector 模块进行自动匹配,当是windows系统时,自动匹配select, linux系统时,自动匹配epoll,传输时会明确告诉内核响应服务器的地址,速度要更快 import select ...

  2. eclipse 自动生成json格式的toString()方法

    文本代码 {"${member.name()}":"${member.value}", "${otherMembers}"}

  3. 迷你MVVM框架 avalonjs 学习教程11、循环操作

    avalon是通过ms-repeat实现对一组数据的批量输出.这一组数据可以是一个数组,也可以是一个哈希(或叫对象).我们先从数组说起吧. 第二节就说,凡是定义在VM中的数组,如果没有以$开头或者没放 ...

  4. git 使用备忘

    git首次安装后的设置: 首先打开hash.exe输入用户名和邮箱 1 2 $ git config --global user.name "Your Name" $ git co ...

  5. Python—— *与** 参数说明

    Python *与** 参数说明 '''*用来传递任意个无名字参数,这些参数会一个Tuple的形式访问''' def fall(*z): print sum(z) print "keys t ...

  6. Hadoop 集群的一些问题

    1.创建用户hadoop adduser hadoop passwd hadoop usermod -a -G hadoop hadoop chown -R hadoop:hadoop  /data ...

  7. https 证书传递、验证和数据加密、解密过程解析

    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议. HTTPS简介 HTTPS其实是有两部分组成:HTTP + SSL ...

  8. 如何设置maven的local repository目录

    step1:默认会放在~/.m2/repository目录下 (“~”代表用户的目录,比如windows下一般都是C:\Documents and Settings\[你的用户名]\.由于“Docum ...

  9. poj1182(带权并查集)

    题目链接:http://poj.org/problem?id=1182 题意:题目告诉有  3  种动物,互相吃与被吃,现在告诉你  m  句话,其中有真有假,叫你判断假的个数  (  如果前面没有与 ...

  10. 【英宝通Unity4.0公开课学习 】(六)76讲到90讲

    还是关于Mecanim动画的内容. 这些讲的每讲长度明显比前面的长,而且很多都涉及到脚本编写. 不过我还是2倍速给略览过去了,主要目的就是学个框架嘛 :) 1. Blend Tree 可嵌套. 可理解 ...