《Effective C++》笔记:III(转载)
转自: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(转载)的更多相关文章
- Item 5:那些被C++默默地声明和调用的函数 Effective C++笔记
Item 5: Know what functions C++ silently writes and calls 在C++中,编译器会自己主动生成一些你没有显式定义的函数,它们包含:构造函数.析构函 ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象
js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...
- [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符
“1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...
- [Effective JavaScript 笔记]第3章:使用函数--个人总结
前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...
- [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码
函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...
- [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法
js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...
- java effective 读书笔记
java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...
- Effective STL 笔记 -- Item 6 ~ 7: Container and Object Pointer
Effective STL 笔记 – Item 6 ~ 7: Container and Object Pointer 中间两次笔记被删掉了,简单补一下: Item 3 中提到如果将对象直接放入容器中 ...
- effective c++ 笔记 (1-3)
// // effective c++.cpp // 笔记 // // Created by fam on 15/3/23. // // //-------------------------- ...
随机推荐
- LeetCode(41)First Missing Positive
题目 Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2 ...
- 杭电 4883 TIANKENG’s restaurant (求饭店最少需要座椅)
Description TIANKENG manages a restaurant after graduating from ZCMU, and tens of thousands of custo ...
- idea 修改Git密码和账号方法
IDEA修改git账号及密码的方法: 1.file->settings->passwords 2.重启IDEA 3.执行一次提交或更新 当执行提交或更新之后,idea会自动提示输入账号.密 ...
- 添物不花钱学JavaEE(基础篇)-JSP
JSP(JavaServer Pages)是做Java Web开发必须掌握的语言. JSP: JavaServer Pages is a technology for developing web p ...
- 【转】Java的path,classpath,java_home环境变量的配置与具体含义
对于一个Java初学者来说,第一步要做的是安装jdk并配置环境变量,一般按照书上或者网上的步骤,一步步照着做就行了,但是对于初学者来说,很多问题没有解决,比如为什么很多配置方法各不相同,却都能够配置成 ...
- BZOJ 1225: [HNOI2001] 求正整数 高精度+搜索+质数
题意:给定n求,有n个因子的最小正整数. 题解:水题,zcr都会,我就不说什么了. 因数个数球求法应该知道,将m分解质因数,然后发现 a1^p1*a2^p2....an^pn这样一个式子, (1+p1 ...
- linux 用户管理、权限管理
1.useradd -[ugGdsce]2.passwd 用户名 ================================================ 1.chmod 2.chown 3. ...
- codeforces Gym 100814 A、B、F、I
A题 先求出来这个数是第几大 阶乘求概率p 然后计算获得胜率的概率 常规解法把所有情况考虑一遍(跳1次,2次,3次……)要用到组合数 数可能太大了会爆的行不通 我们观察发现它有递推性质,从第二大 ...
- 组队训练1 回放(转载至cxhscst2's blog)
第一场组队训练……意料之中的爆炸. 开场先看题,H是斐波那契水题,qw把H切了. 同时czy看I题(排列),cst继续读其他题. czy尝试交I,PE. cst发现K是水题. cst上来敲K,WA ...
- SecureCRT在Tab下的Title显示IP
注意:要针对每个Session进行修改才行. 参考: http://www.cnblogs.com/tyhmj/archive/2013/12/20/3483247.html