More Effective C++ 35个改善方法
美·Scott Meyers 侯捷
More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions
红黑树:
从根到每个叶子节点的路径 都包含相同数目的黑链
从根到每个叶子节点的路径 不能包含两个或更多的连续红链
红黑树是引来表示2-3-4树的
每个节点最多保存3个数据
每个非叶结点要么是2节点,要么是3节点,要么是4节点
所有叶子同一层
2-3-4树 BST树 红黑树 都是内部查找树
B-树是外部查找类型
1,仔细区别指针和引用
- 指针使用*和 -> ;引用使用.
- 没有空引用,一个引用总代表一个对象.因此C++规定引用必须有初值,但指针无此限制.
- 指针可以重新赋值指向另一个对象, 引用却总指它最初的那个对象.
- 实现操作符返回值能被当作右值,只能用引用
2,最好使用C++转型
- static_cast 类型
- const_cast 常量性
- dynamic_cast 安全向下转型
- reinterpret_cast 不具移植性
3,不要以多态处理数组
继承的最重要性质之一:通过指向基类对象的指针/引用,来操作子类对象 .如此的子针/引用称其行为是多态的,就像有多重类型似的.数组也可如此,但总非所愿.
基类指针无法删除子类对象构成的数组.C++语言规范示定义.多态和指针算术不能合用.所以数组和多态不能合用.
4,不要提供默认构造
自己定义构造,保证初始化
5,对定制的类型转换函数警觉
explicit 解决隐式转型带来的问题,将构造声明为explicit编译器不能因隐式转换的需要调用它们,显示转换仍然是可以的.
6,区别增量/减量操作符
重载函数是以参数类型来区别的.后置式有一个int 自变量. const UPint operator ++(int); 前置式UPint& operator++ ();
7,不要重载三个操作符&& || ,
8,意义丰富的new delete
请说明 new operator 和 operator new 之差别?
operator new 唯一任务是分配内存,它都不知道什么是构造.取得operator new 返回来的内存 并转换为一个对象 是new operator .
placement new 将它获得的内存指针返回, #include<new>
如果希望内存产生于堆 使用new operator 它分配内存并调用一个构造
如果只是分配内存 使用operator new 它不知道什么是构造
如果在堆内对象产生时自己决定内存分配 写一个自己的operator new, 并使用new operator 自动调用operator new ,
如果打算在已分配的内存中构造对象 使用placement new
9,利用析构避免泄漏
把资源封装在对象内
10,利用构造避免泄漏
C++只析构已经构造完成的对象.
用智能指针取代指针类成员
11,禁止异常流出析构
Destructors that throw and why they're evil.
12,抛异常与传参数与调虚函数
传参和抛异常的方式有三种 by value, by reference , by pointer
- 但调用一个函数控制权最终回到调用端,但抛一个异常控制权不会再回到抛出端.
- 一个对象被抛出作为异常,总是会发生复制.因此抛异常比传参要慢.如果以by value 方式抛出则会复制2次.
- 被抛出的异常对象,允许的类型转换比 传参要少
- 异常catch子句是最先匹配原则,与出现先后顺序相关. 传参时的函数匹配是类型最佳吻合,无关顺序
13,引用捕捉异常
14,异常声明
函数希望抛什么样的异常
15,异常成本
最低消息,存放一些数据结构
try语块
16,80/20
80/20简化你的生活
17,缓式评估
引用计数
区分读写
缓式取出
表达式缓评估
18,分期摊还预期的计算成本
较佳的速度往往导致较大的内存成本,
19,Amortize the cost of expected computations.
临时对象的来源
20, facilitate the return value optimization.
协助完成返回值优化
21, Overlaoad to avoid implicit type conversions.
利用重载来避免隐式转换
22, Consider using op = insetead of standalone op
考虑使用复合操作符
23,conside alternamteive libraries.
使用其它程序库
24,virtual funtions,multiple inheritance, virtaul base classes,runtive type indetification cost
虚函数表virtual tables vtbls 虚表指针virtual table pointers vptrs
凡有虚函数的class其对象都有一个隐藏的data member 用为指向该class 的vtbl.这个隐藏的vptr是虚函数对象的额外代价,如果对象只含4byte,vptr会使它大小加倍.
虚函数不可inlned的成本
RTTI 运行时期类型辨识:根据class 的vtbl来实现.一个class只需要一份RTTI不会增加对象大小
Inside the c++ object mode . by Stanley B.Lippman,AW 1996.
25, virtualizeing constructors and non member functions.
将构造和非成员函数虚化
所谓虚构造是一个函数,视其输入可以产生不同类型的对象.
虚拷贝构造 返回一个指针,指向其调用者的一个新副本.
26,limiting the number of objects of a class
限制某个class产生的对象数量
允许一个或零个对象 单例
函数static 与class static: class static 即使从未用到也会构造,函数static 在函数第一次调用才产生,如果从未调用则不产生.此外,class static 初始化的时机无法保证
27,Requiring or prohibiting heap based object.
要求/禁止对象产生于堆中
阻止客户不得使用new以外的方式产生对象, 构造/析构私有,
判断某个对象是否位于堆内
28,Smart Pointers.
智能指针
构造和的构 复制和赋值 解引
29,Reference counting.
引用计数
30,Proxy classes.
代理类
31,Making functions virtual with respect ot ore than one object.
让虚函数根据一个以上的对象类型 决定如何虚化
32,Progaram in the future tense.
在未来状态下发展程序
33, Make nonleaf classes abstract
非尾端类设计为抽象类
34,Understand how to combine c and c++ in the same
C 和C++相融
35,familiarize yourself with the language.
习惯C++语言
More Effective C++ 35个改善方法的更多相关文章
- 《Effective C#中文版:改善C#程序的50种方法》读书笔记
作者: suyan010203 来源: 博客园 发布时间: 2011-07-09 14:47 阅读: 8988 次 推荐: 4 原文链接 [收藏] 从去 ...
- Effective C++ 35,36,37
35.使公有继承体现 "是一个" 的含义. 共同拥有继承意味着 "是一个".如 class B:public A. 说明类型B的每个对象都是一个类型A的对象, ...
- Effective Java —— 用静态工厂方法代替构造器
本文参考 本篇文章参考自<Effective Java>第三版第一条"Consider static factory methods instead of constructor ...
- Effective Java 读书笔记之六 方法
一.检查参数的有效性 1.考虑参数有哪些限制,把限制写到文档中,在方法的开头处通过显式地检查来实施这些限制. 二.必要时进行保护性拷贝 1.如果类具有从客户端得到或者返回的可变组件,类就必须考虑保护性 ...
- [Effective Java]第七章 方法
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Effective Java (7) - 避免终止方法
一. 基本概念 1. 所谓的终结方法事实上是指finalize(). 2. Java的垃圾回收机制仅仅负责内存相关清理.其它资源的清理(释放文件.释放DB连接)须要程序猿手动完毕. 3. 调用Syst ...
- More Effective C++ 35 条款
一.基础议题(basics) 条款1:仔细区别 pointers 和 references(Distinguish between pointers and references) 一个基本的语法问题 ...
- Effective Java - [3. 对象通用方法]
Item 10. 若覆盖equals方法,需要遵守规则
- Effective Java 35 Prefer annotations to naming patterns
Disadvantages of naming patterns Typographical errors may result in silent failures. There is no way ...
随机推荐
- CSS选择器种类及介绍
首先说主都有哪些先择器 1.标签选择器(如:body,div,p,ul,li) 2.类选择器(如:class="head",class="head_logo") ...
- HUST软工1506班第2周作业成绩公布
说明 本次公布的成绩对应的作业为: 第2周个人作业:WordCount编码和测试 如果同学对作业成绩存在异议,在成绩公布的72小时内(截止日期4月26日0点)可以进行申诉,方式如下: 毕博平台的第二周 ...
- [转]修改github已提交的用户名和邮箱
改变作者信息 为改变已经存在的 commit 的用户名和/或邮箱地址,你必须重写你 Git repo 的整个历史. 警告:这种行为对你的 repo 的历史具有破坏性.如果你的 repo 是与他人协同工 ...
- 阿里云vsftp安装和简单的配置
1.系统环境 [root@jie ~]# cat /etc/redhat-release CentOS release 6.8 (Final) [root@jie ~]# [root@jie ~]# ...
- 无线显示技术:WiDi,WLAN Display,Air Play,Miracast的摘抄
除了标题提到的WIDI,WLAN Display,Air Play之外,还有Miracast与DLNA的概念,他们之间的区别和联系是什么呢? WIDI: WiDi是英特尔主导的无线音视频传输技术,这也 ...
- mybatis--mapper配置总结
mapper介绍 mapper使用规则:按业务划分,一个业务模块相关的sql均定义在一个mapper文件 mapper的xml格式: doctype: <!DOCTYPE mapper PUBL ...
- Anroid ActionBar 学习资源
Android ActionBar完全解析,使用官方推荐的最佳导航栏(上) http://blog.csdn.net/yuzhiboyi/article/details/32709833 Androi ...
- Web开发工具箱
1.打印1 Web打印组件jatoolsPrinter 2.打印2Lodop 3.web前端利器 Web Essentials
- C#的Winform中OpenFileDialog对话框Filter属性设置包含特定字符,使用正则表达式
OpenFileDialog对话框的Filter属性说明: 首先观察Filter属性的组成部分:“Word文件|*.doc ”,前面的“Word文件”成为标签,是一个可读的字符串,可以自定定义,“|* ...
- sun.misc.Unsafe.park(Native Method)
关闭tomcat时或者重启tomcat时 log4j2 报错: sun.misc.Unsafe.park(Native Method) 异常信息: 30-Aug-2018 15:59:34.900 S ...