《Effective C++》第三版笔记
阅读此笔记前,请先阅读 《Effective C++》第二版笔记 和 《More Effective C++》笔记
这里只记录与上面笔记不同的条款,主要是 "面对对象+模板+内存管理" 三个方面
1、视 C++ 为一个语言联邦
可以分为 C、C with Object、Template C++、STL 四个次语言,不同次语言的高效编程守则可能不一样,比如 C 部分 pass-by-value 通常比 pass-by-reference 高效,而对于 Object-Oriented C++ 而言,由于用户自定义的构造函数和析构函数的存在, pass-by-reference-to-const 往往更好,而到了 STL 中,迭代器和函数对象都是在 C 指针上塑造出来的,所以对 STL 的迭代器和函数对象而言,旧式的 pass-by-value 守则再次适用。
3、尽可能使用 const
使用 const 来修饰一个指针变量时,关键字 const 出现在指针的右边表示指针不可修改,即不能再指向其它数据;如果出现在指针的左边,表示不能使用解引用该指针来改变数据的值(但可以通过改变指向的变量自己来修改值)。比如 STL 中的 const_iterator 就是一个后者的应用。
int main()
{
int i(),j(),k(); int* const pi1 = &i;
*pi1 = ; //right
//pi1 = &k; //error int const * pi2 = &j; //等同于 const int *pi2 = &j;
pi2 = &k; //right
k = ; //right
//*pi2 = 4; //error
}
不能把 const 变量的地址赋给一个 non-const 指针。
改善 C++ 程序效率的一个根本办法是使用 pass-by-reference-to-const 方式来传递对象,而此技术的前提是,我们有 const 成员函数来处理取得的 const 对象。
成员函数有没有用 const 来修饰,可以被重载,这是一个很重要的 C++ 特性。
4、确定对象使用之前已经初始化
略
6、若不想使用编译器自动生成的函数,就该明确拒绝
比如说 boost::noncopyable 的实现:
class noncopyable
{
protected:
noncopyable() {}
~noncopyable() {}
private: // emphasize the following members are private
noncopyable( const noncopyable& );
const noncopyable& operator=( const noncopyable& );
};
拒绝自动生成的函数,可以使用 private 访问修饰符,只声明而不定义即可,或者使用 c++0x 的 delete 关键字更明确。
9、绝不在构造和析构函数过程中调用 virtual 函数
直接通过子类创建子类对象时,会先调用基类构造函数,再调用子类构造函数;销毁子类对象时,会先调用子类析构函数,再调用基类析构函数。
通过基类对象指针创建子类对象,delete 基类对象指针时,只有基类析构函数是 virtual 的,才会先调用子类析构函数,然后再调用基类析构函数。
所以基类构造函数里,不能企图调用 virtual 成员函数实现多态功能,因为此时子类构造函数尚未调用;同样的,基类析构函数里也一样,因为此时子类对象已经先析构了。
13、以对象管理资源
14、在资源管理类中小心 copying 行为
15、在资源管理类中提供对原始资源的访问
17、以独立语句将 newed 对象置入智能指针
18、让接口容易被正确使用,不易被误用
19、设计 class 犹如设计 type
20、宁以 pass-by-reference-to-const 替换 pass-by-value
23、宁以 non-member、non-friend 替换 member 函数
24、若所有参数皆需类型转换,请为此采用 non-member 函数
25、考虑写出一个不抛异常的 swap 函数
27、尽量少做转型
28、避免返回 handles 指向对象内部成分
29、为"异常安全"而努力是值得的
30、透彻了解 inlining 的里里外外
31、将文件间的编译依存关系降至最低
40、明智而审慎的使用多重继承
41、了解隐式接口和编译期多态
42、了解 typename 的双重意义
43、学习处理模板化基类内的名称
44、将与参数无关的代码抽离 templates
45、运用成员函数模板接受所有兼容类型
46、需要类型转换时请为模板定义非成员函数
47、请使用 traits classes 表现类型信息
48、认识 template 元编程
49、了解 new-handler 的行为
50、了解 new 和 delete 的合理替换时机
51、编写 new 和 delete 时需固守常规
52、写了 placement new 也要写 placement delete
《Effective C++》第三版笔记的更多相关文章
- Effective Java 第三版笔记(目录)
<Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时 ...
- 《Effective Java 第三版》新条目介绍
版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...
- effective java(第三版)---读书笔记
第一章 引言 < Effective Java>这本书并不厚,而且并不适合初学者,适合有一定的工作经验的java攻城狮.这本书不是百科全书式的JAVA 手册,而是试图在讲述如何正确.高效地 ...
- Effective Java第三版(一) ——用静态工厂代替构造器
此文做为<Effective Java>系列的第一篇,所以有必要大概说下此书的特点,当然很多人可能都看过,毕竟是有着Java四大名著之一的大名在外,不过总会有萌新不了解,例如我!<E ...
- C++学习书籍推荐《Effective C++ 第三版》下载
百度云及其他网盘下载地址:点我 编辑推荐 <Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)>前两个版本抓住了全世界无数程序员的目光.原因十分明显:S ...
- 《Effective Java 第三版》目录汇总
经过反复不断的拖延和坚持,所有条目已经翻译完成,供大家分享学习.时间有限,个别地方翻译得比较仓促,希望有疑虑的地方指出批评改正. 第一章简介 忽略 第二章 创建和销毁对象 1. 考虑使用静态工厂方法替 ...
- 疯狂java讲义 第三版 笔记
java7新加特性: 0B010101 二进制数 int c=0B0111_1111; 数值中使用下划线分隔 switch 支持String类型 字符串常量放在常量池 String s0 ...
- 《Effective C++(第三版)》-笔记
1. 让自己习惯C++ 条款01: 视C++为一个语言联邦 1.1 C++ 是一个多重泛型编程语言(multiparadigm programming),支持:过程形式(procedural),面向对 ...
- effective Java 第三版学习笔记
创建对象类型的 1,静态工厂方法代替构造器 静态工厂方法有名称,不容易混乱他的作用 不必再每次调用他的时候创建实例,创建实例的代价是高的,可以重复利用缓存的对象 静态工厂甚至能返回子类对象,例如在接口 ...
随机推荐
- Linux解压命令(tar)
tar zxvf phddns_raspberry.tgz tar默认解压到当前目录 参数: 运行tar时必须要有下列参数中的至少一个才可运行 -A, --catenate, --concatenat ...
- http80端口转发(实现微信公众号接口绑定IP时,同时支持多个公众号)
http80端口转发 背景 微信公众平台接口绑定服务器时,如果使用IP需要使用80端口,此组件可实现一个IP上绑定多个公众平台接口 使用方法 http://(IP)/WeixinMP/(转发的地址Ba ...
- bzoj4419[SHOI2013]发微博
题意:给你一个初始没有边,点权均为0的无向图,三种操作:加边,删边,选择一个点将当前与之相邻的点(不包括自身)的点权+1,询问最后所有点的点权. 据说正解是set维护每个人的朋友,然后考虑每次加边.删 ...
- 恶意软件/BOT/C2隐蔽上线方式研究
catalogue . 传统木马上线方式 . 新型木马上线方式 . QQ昵称上线 . QQ空间资料上线 . 第三方域名上线 . UDP/TCP二阶段混合上线 . Gmail CNC . NetBot两 ...
- PHP扩展——C扩展实现滚动记录日志
前言 万事开头难,没错就是这样!! 在没有真正开发PHP扩展之前,一直觉得PHP扩展开发对我来说是一个很遥远的事情,虽然自己有些C\C++基础,但是看PHP源码的时候还是很吃力,现在看来主要还是没有下 ...
- NYOJ 16 矩形嵌套(经典动态规划)
传送门 Description 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于 ...
- Mac下同时安装多个版本的JDK
JDK8 GA之后,小伙伴们喜大普奔,纷纷跃跃欲试,想体验一下Java8的Lambda等新特性,可是目前Java企业级应用的主打版本还是JDK6, JDK7.因此,我需要在我的电脑上同时有JDK8,J ...
- C#调用c++Dll 结构体数组指针的问题
参考文章http://blog.csdn.net/jadeflute/article/details/5684687 但是这里面第一个方案我没有测试成功,第二个方案我感觉有点复杂. 然后自己写啦一个: ...
- Negative log-likelihood function
Softmax function Softmax 函数 \(y=[y_1,\cdots,y_m]\) 定义如下: \[y_i=\frac{exp(z_i)}{\sum\limits_{j=1}^m{e ...
- Django 自带的ORM增删改查
通过Django来对数据库进行增删改查 1 首先创建类,在app应用程序里面的model模块里面创建类,写好数据库信息,方便我们待会初始化: 2 创建在django项目里面的settings里面添加 ...