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. 3 Python 函数介绍

    1.函数的基本概念 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 语法定义 def ...

  2. Winform-图片上传

    1.界面上拖个.pictureBox(pictureBox1) //上传点击按钮 private void button1_Click(object sender, EventArgs e) { Op ...

  3. spring boot 测试类

    import org.junit.Test;import org.junit.runner.RunWith;import org.slf4j.Logger;import org.slf4j.Logge ...

  4. hibernate中1对1的注解配置

    hibernate中1对1的注解配置分为:外键关联映射和主键关联映射 1.外键配置 //一方@Entity@Table(name="test_classinfo")public c ...

  5. mac版IDEA使用maven的问题

    在idea中执行maven碰到这个错误:invalid target release: 1.7.首先做了以下操作 1.查看$JAVA_HOME echo $JAVA_HOME /Library/Jav ...

  6. Nsis Sqlite Plugin

    1.https://stackoverflow.com/questions/15346338/nsis-and-sqlite-integration 2.http://nsis.sourceforge ...

  7. spring security 非页面登录

    参考https://stackoverflow.com/questions/36937414/auto-login-spring-security UserDetails userDetails = ...

  8. My Goal For SE

    2016年2月份,我开始进入软件工程的学习.作为一名大三学生,我对于此项课程,希望我自己能够通过制定学习目标来学好它. 首先,当我们在执行软件开发的时候,我们应该明确每个人的负责模块,我们应该明确自己 ...

  9. Mysql操作日志

    任何一种数据库中,都有各种各样的日志.MySQL也不例外,在Mysql中有4种不同的日志.分别错误日志.二进制日志.查询日志和慢查询日志.这些日志记录着Mysql数据库不同方面的踪迹.下文将介绍这4种 ...

  10. 带图标的input

    <style> .text{ border:solid 2px #ccc; width:400px; height:40px; background:url(http://d.lanren ...