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)如果成员的析构函数是删除的,或者没有类内初始化器,那么类的默认构造函数是删除的,因为这个成员无法创建和无法销毁。

[C++]类的设计(2)——拷贝控制(阻止拷贝)的更多相关文章

  1. [C++]类的设计(2)——拷贝控制(拷贝控制和资源管理)

      1.类的行为分类:看起来像一个值:看起来想一个指针.     1)类的行为像一个值,意味着他应该有自己的状态.当我们拷贝一个像值的对象时,副本和原对象是完全独立的.改变副本不会对原有对象有任何影响 ...

  2. C++ Primer : 第十三章 : 拷贝控制之拷贝、赋值与销毁

    拷贝构造函数 一个构造函数的第一个参数是自身类类型的引用,额外的参数(如果有)都有默认值,那么这个构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是一个引用类型. 合成的拷贝构造函数   在我们没 ...

  3. C++ Primer : 第十三章 : 拷贝控制之拷贝控制和资源管理

    定义行为像值的类 行为像值的类,例如标准库容器和std::string这样的类一样,类似这样的类我们可以简单的实现一个这样的类HasPtr. 在实现之前,我们需要: 定义一个拷贝构造函数,完成stri ...

  4. [C++ Primer] : 第13章: 拷贝控制

    拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符 ...

  5. [C++] 类的设计(2)——拷贝控制(1)

    1.一个类通过定义五种特殊的成员函数来控制此类型对象的拷贝.移动.赋值和销毁:拷贝构造函数.拷贝赋值运算符.移动构造函数.移动赋值运算符和析构函数.(拷贝.移动.析构)   2.拷贝和移动构造函数定义 ...

  6. [C++]类的设计(2)——拷贝控制(析构和三五法则)

    1.析构函数:释放对象使用的资源,并销毁对象的非static数据成员:析构函数不接受参数,因此不能被重载.对于一个给定类,有且只有一个析构函数.   2.析构函数的组成:一个函数体+一个析构部分(im ...

  7. C++的那些事:类的拷贝控制

    1,什么是类的拷贝控制 当我们定义一个类的时候,为了让我们定义的类类型像内置类型(char,int,double等)一样好用,我们通常需要考下面几件事: Q1:用这个类的对象去初始化另一个同类型的对象 ...

  8. OOP3(继承中的类作用域/构造函数与拷贝控制/继承与容器)

    当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内.如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义 在编译时进行名字查找: 一个对象.引用或指针的 ...

  9. C++类拷贝控制 深拷贝 浅拷贝

    普通类型对象之间的复制很简单,而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量,这篇文章将帮你理清C++类对象的拷贝方式 拷贝构造函数,拷贝赋值运算符 首先我们简单了解下默认的拷贝 ...

随机推荐

  1. Scrapy框架解读

    1. Scrapy组件a. 主体部分i. 引擎(Scrapy):处理整个系统的数据流处理,触发事务(框架核心)ii. 调度器(Scheduler):1) 用来接受引擎发过来的请求, 压入队列中, 并在 ...

  2. 分享各大CMS采集资源站网址合集

    分享各大CMS采集资源站网址合集 http://www.172zy.xyz/ 172云资源 http://www.dbzyz.com/ 豆瓣云资源 http://www.gaoqingzy.com/ ...

  3. Google Protocol Buffer Basics: C++

    proto文件简介 每个元素上的"= 1","= 2"标记标识该字段在二进制编码中使用的唯一"标记" 每个字段有三个可选修饰符 requir ...

  4. JavaScrip数据类型

    数据类型: 基础数据类型: Number String Boolean Undefined Null 引用数据类型: Object Symbol

  5. unity_实用小技巧(空指针错误)

    在游戏开发中,空指针错误是我们最常见也是最容易出现的错误.下面介绍一下博主近期遇见的空指针错误 如上图,有两个类,如果此时我们在图2中调用图1的单例模式可能会出现空指针错误. 原因在于:编译器可能先执 ...

  6. Leetcode之回溯法专题-52. N皇后 II(N-Queens II)

    Leetcode之回溯法专题-52. N皇后 II(N-Queens II) 与51题的代码80%一样,只不过52要求解的数量,51求具体解,点击进入51 class Solution { int a ...

  7. WPF 浏览PDF 文件

    添加成功后会在工具箱里看到下图所示的控件.打开VS2010,新建项目(WpfPDFReader),右键项目添加User Control(用户控件).因为Adobe PDF Reader COM 组件是 ...

  8. codeforces 816 B. Karen and Coffee(思维)

    题目链接:http://codeforces.com/contest/816/problem/B 题意:给出n个范围,q个查询问查询区间出现多少点在给出的n个范围中至少占了k次 题解:很显然的一道题目 ...

  9. Two Graphs 牛客网暑期ACM多校训练营(第一场)D 图论基础知识 全排列

    链接:https://www.nowcoder.com/acm/contest/139/D来源:牛客网 Two undirected simple graphs and where are isomo ...

  10. 【Offer】[67] 【把字符串转换成整数】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能 ...