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 ...
随机推荐
- vnpy自动化交易
c++ python 写的自动化交易平台 期货ctp
- Oracle RMAN-06023 和ORA-19693错误
在将一个0级备份的数据库还原到其它机器上时,首先遇到了RMAN-06023然后遇到ORA-19693错误,错误发生的环境和内容大致如下: 数据库版本: SQL> select * from v$ ...
- Vmware下CentOs7 桥接模式下配置固定IP
1.安装完CentOS7后 修改虚拟机网络适配器配置:改成桥接模式 2.设置Vmware的 编辑->虚拟网络编辑器 3.重启CentOs7 , 查看网络 # ip addr interface是 ...
- CodeForces 339D Xenia and Bit Operations (线段树)
题意:给定 2的 n 次方个数,对这些数两个两个的进行或运算,然后会减少一半的数,然后再进行异或运算,又少了一半,然后再进行或运算,再进行异或,不断重复,到最后只剩下一个数,要输出这个数,然后有 m ...
- SQl语句收藏
/* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */ mysq ...
- 用Docker搭建WordPress
环境准备 CentOS 安装docker https://yeasy.gitbooks.io/docker_practice/content/install/centos.html docker-co ...
- Linux下MySQL表名不区分大小写的设置方法
MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大小写不一致造成的. mysql在window ...
- 【扫盲贴】为什么屏幕分辨率是 640x480
本文原地址:http://www.easyx.cn/skills/View.aspx?id=172 常见的屏幕分辨率很奇怪,为什么总用一些不零不整的数字?比如以前最常见的分辨率是 640x480,当初 ...
- struts2下面如何同时使用servlet,就是如何实现struts与servlet共存
转载 原文链接:https://blog.csdn.net/u013358115/article/details/20706607 问题 项目要求struts2和servlet能够共存,就是strut ...
- php中this、self、parent解析
概述: this:指向类当前对象的指针:self:指向类本身,一般指向类中的静态变量:parent:指向父类的指针,一般使用parent来调用父类的构造函数. 下面通过程序详细介绍: 1.this & ...