问题聚焦:
如果不希望class支持某一成员函数,那么不声明和定义它就可以了,但是这一策略对与拷贝构造函数和重载赋值操作符并不起作用。
因为如果不声明它们,那么当尝试调用它们的时候,编译器会为你声明和定义它们。
这显然不是你所希望看到的。
方法:将这类你不想使用并且也不想编译器为你声明的函数声明为private, 而不实现它们。
原理:
编译器自动生成的函数都是public
声明一个函数可以阻止编译器自动生成该函数
令这个函数为private可以阻止人们调用它

缺陷:

member函数或friend函数可以调用它们,导致链接错误。

Demo:


class HomeForSale {
public:... ...
private:...HomeForSale(const HomeForSale&);HomeForSale& operator=(const HomeForSale&);
};


上面的方案虽然有一个小小的缺陷,但是还是可以让人接受的,毕竟链接错误不是那么的不可接受。
很多时候我们总是希望尽可能地找到错误,毕竟链接错误远不如编译错误那样相对容易解决一点。
这也是这个方案可以优化的地方(尽管我觉得很多时候可以不这么做)
方案二:在方案一的基础上,将链接期错误移至编译器。
先来看看demo.
Demo:

class Uncopyable {
protected:Uncopy() {}~Uncopy() {}
private:Uncopyable (const Uncopyable&);Uncopyable& operator=(const Uncopyable&);
};
//  为了阻止编译的自动生成,我们唯一需要做的就是继承Uncopyableclass  HomeForSale: private Uncopyable {......
};


原理:
当尝试拷贝操作时,编译器会尝试调用父类的对应的拷贝构造函数和重载赋值操作符,这些调用会被编译器拒绝,因为其base class的拷贝函数是private
从而报出编译错误。

小结:

为了阻止编译器的自动生成功能,可以将相应的成员函数声明为private并且不予实现。
使用向Uncopyable这样的base class也是一种做法。

参考资料:
《Effective C++ 3rd》

转载于:https://www.cnblogs.com/suzhou/p/3638966.html

Effective C++(6) 如何拒绝编译器的自动生成函数相关推荐

  1. 怎么证明未显式定义构造方法时,编译器会自动生成无参的构造方法?

    在和类和对象篇提到: 当没有显式定义构造方法,编译器会自动提供一个没有参数的构造方法 若类中显式定义了构造方法,则默认的无参构造不再产生 本篇博客就带大家一起来验证~ 首先,显式定义构造方法:即 自己 ...

  2. C语言一定要有函数声明吗,1 什么是C语言的隐式函数声明在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下...

    1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码.下面是一个例子: int main(int ...

  3. PyCharm 不能自动生成函数注释

    PyCharm 中可以在新建文件自动生成文件头注释,实现自动生成运行环境,作者.日期等必要信息,使用比较方便,配置十分简单,具体设置可参考这篇博客. 另外,PyCharm在定义函数之后,可以自动生成包 ...

  4. 条款6:明确拒绝编译器自动生成的函数

    有的类对象是独一无二的,不希望有复制函数,又因为如果不声明复制函数会自动生成复制函数,所以要明确拒绝. 两种不同方法 方法一 class HomeForSale:private Uncopyable{ ...

  5. java自动生成函数注释_IDEA类和方法注释自动生成(2019-08-31 21:47写)

    1. 生成类注释 打开Preferences-->Editor-->File and Code Templates,右侧选择Filestab页,找到Class.Interface,可以看到 ...

  6. [python]pycharm自动生成函数注释

    函数涉及到多个参数的时候注释是一个不可或缺的好帮手,手动生成参数又是一件比较费事的事情,我们能想到的pycharm也替我们想到了,并给出了比较不错的解决方案,一次设置长期有效: 设置方法也比较简单: ...

  7. pycharm自动生成函数调用图

    pycharm自动生成函数调用图 1.下载并安装graphviz 1.1 下载链接:https://graphviz.gitlab.io/_pages/Download/windowshiyo那个s/ ...

  8. 解决Pycharm不能自动生成函数注释

    PyCharm在定义函数之后,可以自动生成包括参数和返回值在内的注释,具体使用方法为: 函数定义后,另起一行,输入三对引号(单引号和双引号均可),后回车 def f(b,c): ''' 输出结果为 d ...

  9. pycharm自动生成函数注释及注意事项

    不少博客都说过怎么生成注释,但是照着别人的博客自己实践不少次才成功,简单记录下 首先,检查pycharm的设置: 如果这里是plain的话,需要先改成其他的选项 其次,假如有个函数如下: def fu ...

  10. 主键字母自动生成函数

    -- 动态生成字母方式主键,A-Z 大于Z自动进位[26进制数值表示]-- 参数:动态查询表和主键列 create or replace function charkey (tabName char, ...

最新文章

  1. url传递中文的解决方案
  2. github登陆方案
  3. Unity2D游戏开发基础教程1.2项目、资源和场景
  4. 【译】光线跟踪:理论与实现(一) 简介
  5. 经典C语言程序100例之九零
  6. 一份关于.NET Core云原生采用情况调查
  7. 您在2016年会做什么? Apache Spark,Kafka,Drill等
  8. 专升本c语言名词解释题_专升本到底难不难?
  9. 安装nokogiri前提
  10. 我知道真相,但我仍然勇往直前
  11. Hibernate之HQL查询
  12. 杭电acm1000c语言答案,c语言,杭电acm1328这题怎么做啊,求提示!!!
  13. SPSS安装激活教程(包含网盘链接)
  14. js页面刷新事件 ,Javascript刷新页面的几种方法
  15. 计算机毕业设计ssm民宿预定管理系统20sxh系统+程序+源码+lw+远程部署
  16. 随机梯度下降法与批处理梯度下降法
  17. 镭速关于高速数据传输的介绍!
  18. WEB——07JDBC
  19. 用友修改了变量不能连接到服务器,用友T3客户端登录提示 运行时错误91:未设置对象变量...
  20. QT操纵excel详解2:实现对excel的全面控制

热门文章

  1. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_26-页面查询接口测试-Postman...
  2. extern 头文件 定义声明
  3. C11简洁之道:函数绑定
  4. day03_01 Python历史、32bit和64bit系统的区别
  5. POJ 1300 Door Man 欧拉路的判断
  6. A*算法 带cocos2d-x例子 a*寻路算法
  7. JS 使用RSA加密解密
  8. Java内存溢出定位和解决方案(new)
  9. leetcode 181 Employees Earning More Than Their Managers 不会分析的数据库复杂度
  10. jQuery的对象访问函数(get,index,size,each)