转自:http://www.cnblogs.com/destino74/p/3960802.html

  

  条款5:Know what functions C++ silently writes and calls

  

译:了解C++默默编写并调用哪些函数

在C++中,写一个空类,编译器会自动为它声明一个copy构造函数、一个copy assignment操作符和一个析构函数。如果没有声明任何构造函数,编译器也会自动声明一个default构造函数。

如下:

class Empty{};

这就相当于

class Empty{
public:
    Empty(){...}
    Empty(const Empty& rhs){...}
    ~Empty(){...}
    Empty& operator=(const Empty& rhs){...}
}

关于构造函数、copy构造函数的东西前两篇已经有介绍了。

条款6:Explicitly disallow the use of compiler-generated functions you do not want

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

在一些场合,如果你不想对象内的某个函数被调用,可以把这些函数声明成private隐藏起来,这也是Java中实现工厂模式禁止new一个对象的伎俩。

但其实这并不保险,这些函数依然可以在成员函数或friend函数中被调用,当然,你可以人为的明令禁止调用这些函数。

书中提到的解决方法是只声明不定义。这就是我常犯的错误,声明了函数却没有定义函数体,在编译时会给出一个”无法解析的外部符号”这样的错误。

而利用这一点,就可以达到屏蔽自动生成的函数这一目的。

另一个方法就是实现一个类似Uncopyable接口的类,把需要隐藏的函数声明为私有函数,然后在派生类中私有继承这个Uncopyable类。

将成员函数声明为private且不实现,可禁止编译自动提供的函数。使用像Uncopyalbe这样的基类也能达到相同的目的。

条款7:Declare destructors virtual in polymorphic base classes

译:为多态基类声明virtual析构函数

为什么要为多态基类声明virtual析构函数(虚析构函数)呢?原因是当一个指向派生类的基类指针被销毁时,会调用基类的析构函数,而这时派生类 的析构函数未能执行,派生类对象的成员变量 很可能没被销毁,这就为资源泄漏和莫名其妙的BUG提供温床,相应地增加你在调试上花的时间。

所以,在所有含virtual函数(虚函数)的类中,都应该声明virtual析构函数,这使它在不同的派生类中有不同的表现,从而让派生类中的资源在销毁时能被正确释放。

值得一提的是,当类中不含虚函数时,这往往意味着该类并不是设计来被继承,就不该声明虚析构函数,因为这从未声明一样。

书中提到了不应该继承任何不带virtual析构函数的类(如所有STL容器),在学习STL查阅资料时就了解到, 继承STL的作法给会造成各种糟糕的后果,因此自己在使用的时候总是以组合代替继承,就没有遇到过书中提到的、以及网上大量因继承STL而造成的问题。

带多态性质的基类应该声明一个virtual析构函数。任何带有virtual函数的类都应该拥有一个virtual析构函数。

如果一个类不希望作为基类被继承或不是为了具备多态性而设计,就不该声明virtual析构函数。(不应该设计STL容器派生类)

《Effective C++》笔记:III(转载)的更多相关文章

  1. Item 5:那些被C++默默地声明和调用的函数 Effective C++笔记

    Item 5: Know what functions C++ silently writes and calls 在C++中,编译器会自己主动生成一些你没有显式定义的函数,它们包含:构造函数.析构函 ...

  2. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  3. [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

    js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...

  4. [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

    “1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...

  5. [Effective JavaScript 笔记]第3章:使用函数--个人总结

    前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...

  6. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

    函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...

  7. [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

    js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...

  8. java effective 读书笔记

    java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...

  9. Effective STL 笔记 -- Item 6 ~ 7: Container and Object Pointer

    Effective STL 笔记 – Item 6 ~ 7: Container and Object Pointer 中间两次笔记被删掉了,简单补一下: Item 3 中提到如果将对象直接放入容器中 ...

  10. effective c++ 笔记 (1-3)

    // //  effective c++.cpp //  笔记 // //  Created by fam on 15/3/23. // // //-------------------------- ...

随机推荐

  1. noi.ac NOIP2018 全国热身赛 第二场 T3 color

    [题解] 我们可以发现每次修改之后叶子结点到根的路径最多分为两段:一段白色或者黑色,上面接另一段灰色的.二分+倍增找到分界点,然后更新答案即可. check的时候只需要判断当前节点对应的叶子结点的区间 ...

  2. Atcoder regular Contest 073(C - Sentou)

    Atcoder regular Contest 073(C - Sentou) 传送门 每个人对开关的影响区间为a[i]--a[i]+t,因此此题即为将所有区间离散化后求所有独立区间的长度和 #inc ...

  3. S3C2440的内存情况在NAND FLASH或者NOR FLASH启动的情况下

    1,从NANDFLASH启动时,在ARM上电时,ARM会自动把NANDFLASH前4K的内容拷贝到S3C2440内部SRAM中,同时把SRAM的地址映射到0X00000000.ARM上电后会从SRAM ...

  4. CPLD和FPGA中不同电压的JTAG电路设计注意事项

    在初次的cpld电路设计的时候,遇到了这样的一个问题,整个系统是3.3V的系统,选用的cpld是XC9536-10VQ44C,芯片供电电压5V.他的io可以配置成3.3V和5V两种形式,因此,选用的时 ...

  5. 移动Web解决方案的链接收藏

    信息类 html5 浏览器兼容性查询 - 浏览器内建对象文档 es5规范浏览器兼容性表格 es6规范浏览器兼容性表格 stackoverflow 最靠谱的问题解决方案 github 开源代码网站 全球 ...

  6. STM32F407 GPIO 库函数编程套路(led与beep总结) 个人笔记

    本文由正点原子STM32F407探索者开发板的led和beep实验,总结了gpio编程的套路. 下文中以hardware 来称呼可能的硬件外设,如led或beep等. 新建项目后主要用到三个文件:ha ...

  7. cmake打印变量值

    看下面的例子,我们在cmake定义了一个变量“USER_KEY”,并打印此变量值.status表示这是一般的打印信息,我们还可以设置为“ERROR”,表示这是一种错误打印信息. SET(USER_KE ...

  8. Linux网络设置

    ==========================网络设置========================== 1.IP地址 临时:ifconfig 192.168.124.129 永久: vi / ...

  9. the apple code

    i know you will forget but 9 you will

  10. NYOJ 题目42 一笔画问题(欧拉图)

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 zyc从小就比較喜欢玩一些小游戏.当中就包含画一笔画.他想请你帮他写一个程序.推断一个图是否可以用一笔画下 ...