条款6:若不想使用编译器自动生成的函数,就该明确拒绝

若我们需要如下需求:

地产中介商会认位自己卖的房子是独一无二的,无法复制的

class HomeForSale{};HomeForSale h1;
HomeForSale h2;
HomeForSale h3(h1); //不想让这句话通过编译
h1 = h2;           //不想让这句话通过编译

我们不想上述两句话能够执行成功!但是如果我们不写相应的拷贝构造和=重载,则编译器会帮我们默认添加。所以就出现一下解决方案,分别分析一下好坏。

1、copy构造函数和copy assignment操作符声明为private,并且实现他们。

  • 优点:我们阻止了编译器私自创建该版本,阻止用户调用它
  • 缺点:并不绝对安全,因为成员函数和friend函数仍然可以调用该私有函数。

2、copy构造函数和copy assignment操作符声明为private,仅提供声明而不实现。
优点:不仅阻止编译器私自创建和用户调用,而且保证若有成员函数和friend函数使用他们的话,会报链接错误。
缺点:链接错误太迟了,能不能提前到编译期间报错?

3、专门设计一个为了阻止拷贝的基类,进行私有继承该类。
代码例子如下:

class Uncoyable
{
protected:Uncoyable(){}~Uncoyable(){}
private:Uncoyable(const Uncoyable&);Uncoyable& operator=(const Uncoyable&);
};class HomeForSale : private Uncoyable  //注意是私有继承
{//...//不再需要声明拷贝构造和=操作符重载
};

这种方法原理是什么呢?
答: 只要任何人尝试拷贝HomeForSale对象,编译器试着生成一个copy构造和=运算符重载,但是这些生成版本会尝试调用基类Uncoyable的拷贝,但是因为基类Uncoyable的拷贝是私有的,所以该操作直接在编译期间被编译器给拒绝了!

总结: 为了驳回编译器自动提供的机能,可将相应函数声明为私有且仅声明不实现。或者像使用Uncoyable这样的基类私有继承也是一种方式!

结尾: 我是航行的小土豆,喜欢我的程序猿朋友们,欢迎点赞+关注哦!希望大家多多支持我哦!有相关不懂问题,可以留言一起探讨哦!

如有引用或转载记得标注哦!

effective c++阅读之旅---条款6相关推荐

  1. More Effective C++ 阅读笔记 解释清晰

    文章目录 3.1 Item M1: 指针与引用的区别 3.2 Item M2:尽量使用C++风格的类型转换 3.3 Item M3:不要对数组使用多态 3.4 Item M4:避免无用的缺省构造函数 ...

  2. 《Effective C++》学习笔记——条款26

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  3. Effective Java 阅读笔记——方法

    38:检查参数的有效性 每当编写方法或者构造器的时候,应该考虑它的参数有哪些限制,在方法的开头处对参数进行检查,并且把这些限制写入文档. 注意: 对于公有方法,应该使用@throws标签在文档中说明违 ...

  4. Effective C++ 的52个条款列表

    原文链接: 在线手册 第一章 从C转向C++ 条款1:尽量用const和inline而不用#define 条款2:尽量用而不用 条款3:尽量用new和delete而不用malloc和free 条款4: ...

  5. Effective C++ 小笔记:条款13-17(第三章)

    常用的资源有:内存.文件描述器(file descriptor).互斥锁(mutex locks).图形界面中的字体和笔刷.数据库连接.以及网络sockets.这些资源一般动态创建和分配,也就是一个指 ...

  6. [Effective C++读书笔记]005_条款05_了解C++默默编写并调用哪些函数

    其实这一点在C++的基础类入门书,如C++ primer里面也有说过,不过很少有人去注意而已,作者把这一点提出来,是为了提醒我们. 这一条款的内容如下:就是说当你书写下面的[代码片段1]的时候,其实经 ...

  7. Effective Java阅读笔记——引言

    "我很希望10年前就拥有这本书.可能有人认为我不需要任何Java方面的书籍,但是我需要这本书." --Java之父 James Gosling 在图书馆找到这本java著作时,首先 ...

  8. Effective Modern C++翻译(3)-条款2:明白auto类型推导

    条款2 明白auto类型推导 如果你已经读完了条款1中有关模板类型推导的内容,那么你几乎已经知道了所有关于auto类型推导的事情,因为除了一个古怪的例外,auto的类型推导规则和模板的类型推导规则是一 ...

  9. 《Effective Modern C++》翻译--条款4:了解怎样查看推导出的类型

    条款4:了解怎样查看推导出的类型 那些想要了解编译器怎样推导出的类型的人通常分为两个阵营. 第一种阵营是实用主义者.他们的动力通常来自于编敲代码过程中(比如他们还在调试解决中),他们利用编译器进行寻找 ...

最新文章

  1. 望手指半月痕可知内脏疾病
  2. 免费课程 | 云脑机器学习实战训练营,中美大咖携手带你飞!
  3. python中nlp的库_用于nlp的python中的网站数据清理
  4. 基础、语法都不是最重要的,学Python最重要的是什么?编程思路!
  5. canvas简单五子棋
  6. mongoshake实现mongodb数据同步
  7. Openlayer4 - 最好最强大的开源地图引擎
  8. Qt总结之八:绘制仪表盘
  9. 开发者论坛一周精粹(第六十三期) WHM自动脚本修复ssh问题
  10. RHadoop搭建(HDFS+MapReduce)
  11. CSDN-怎么设置被粉丝关注之后的自动回复
  12. 皮皮虾如何引流?皮皮虾运营如何变现?皮皮虾APP怎么引流?
  13. Java随笔记 - TCP通信的基本过程,三次握手,四次挥手
  14. mysql语句大小写要求_mysql踩坑(一)-大小写规则
  15. 给语音识别文本加上标点符号
  16. 学编程用什么系统好?
  17. HIT2372 Recoup Traveling Expenses(最长单调子序列)
  18. 阅读笔记:软件需求十步走(三)
  19. 游戏特效贴图的制作与应用
  20. 指派问题与匈牙利算法

热门文章

  1. maven打包二进制文件
  2. 【leetcode】二维子矩阵的和
  3. 字符串哈希--聪聪的加法等式
  4. Ceph RGW高可用HA集群keepalived+Haproxy
  5. 将数组作为参数进行传递(转)
  6. 用js获取浏览器当前版本
  7. Mysql实现排名及指定内容查询排名
  8. Office文档在线编辑的实现
  9. Vim 8文本处理实战 第二章 高级编辑和文本浏览 阅读笔记2
  10. SAP SuccessFactors 功能介绍