美·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++语言

Exceptional C++47

More Effective C++ 35个改善方法的更多相关文章

  1. 《Effective C#中文版:改善C#程序的50种方法》读书笔记

    作者: suyan010203  来源: 博客园  发布时间: 2011-07-09 14:47  阅读: 8988 次  推荐: 4                   原文链接   [收藏] 从去 ...

  2. Effective C++ 35,36,37

    35.使公有继承体现 "是一个" 的含义. 共同拥有继承意味着 "是一个".如  class B:public A. 说明类型B的每个对象都是一个类型A的对象, ...

  3. Effective Java —— 用静态工厂方法代替构造器

    本文参考 本篇文章参考自<Effective Java>第三版第一条"Consider static factory methods instead of constructor ...

  4. Effective Java 读书笔记之六 方法

    一.检查参数的有效性 1.考虑参数有哪些限制,把限制写到文档中,在方法的开头处通过显式地检查来实施这些限制. 二.必要时进行保护性拷贝 1.如果类具有从客户端得到或者返回的可变组件,类就必须考虑保护性 ...

  5. [Effective Java]第七章 方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. Effective Java (7) - 避免终止方法

    一. 基本概念 1. 所谓的终结方法事实上是指finalize(). 2. Java的垃圾回收机制仅仅负责内存相关清理.其它资源的清理(释放文件.释放DB连接)须要程序猿手动完毕. 3. 调用Syst ...

  7. More Effective C++ 35 条款

    一.基础议题(basics) 条款1:仔细区别 pointers 和 references(Distinguish between pointers and references) 一个基本的语法问题 ...

  8. Effective Java - [3. 对象通用方法]

    Item 10. 若覆盖equals方法,需要遵守规则

  9. Effective Java 35 Prefer annotations to naming patterns

    Disadvantages of naming patterns Typographical errors may result in silent failures. There is no way ...

随机推荐

  1. linux 下删除乱码文件-乾颐堂

    在linux下删除文件,遇到特殊字符是一件非常头疼的事情. 1. 如果文件名带 ‘-’ 或者‘--’这样的字符 删除办法为:rm -- 文件名 如文件名为:-pythontab.tgz 如果用普通方法 ...

  2. sql分组获取第一条记录(sql+oracle)

    sql版本 select * from (select t.CloseDate,t.ExpiryDate,t.DataTypeLookupID,ROW_NUMBER() over(partition ...

  3. 使用VM克隆CentOS后,更改网络配置

    在使用VM克隆之后,遇到一件非常郁闷的事,就算我使用‘setup’命令,修改了我的网络配置,依然无法查询到我配置的网卡,也无法开启网卡. 经过百度等一系列手段,总结如下套路--PS:朋友称之为“破釜沉 ...

  4. 大型Unity手游《英雄之刃-最后之战》源码分析

    英雄之刃之最后一战是国内首款原创精品MOBA手游,是一款由前暴雪文案亲自操刀世界观,日韩专业团队打造美术场景,新加坡团队精心制作战斗音乐的旷世之作! 超快速的匹配对战.默契的团队协作给你带来意犹未尽的 ...

  5. 深入理解java虚拟机(四)垃圾收集算法及HotSpot实现

    垃圾收集算法 一般来说,垃圾收集算法分为四类: 标记-清除算法 最基础的算法便是标记-清除算法(Mark-Sweep).算法分为“标记”和“清除”两个阶段:首先标记处需要收集的对象,在标记完成之后,再 ...

  6. CodeForces - 631C ——(思维题)

    Each month Blake gets the report containing main economic indicators of the company "Blake Tech ...

  7. Linq基础必备

    1.linq基础必备之对象初始化器和匿名类型因果分析   3. 一:对象初始化器 1.就是在new的时候给公共属性赋值的一种方式 2. 在没有初始化器之前的时候,我们是怎么初始化的呢??? 1. 构造 ...

  8. Mybatis 拦截器报错org.apache.ibatis.executor.statement.StatementHandler.prepare(java.sql.Connection)

    出现此错误的原因是MyBatis 3.4.0 之后,StatementHandler的prepare方法做了修改,如下: 在args = { Connection.class }中添加第二个参数,即 ...

  9. MySQL数据库(二)

    1.模糊查询like 在where 后面使用like 通配符: % 任意字符 _ 单个字符 2.order by 排序 order by price //默认升序排序 order by price d ...

  10. Conditional Expressions

    Conditional Expressions建立一些逻辑关系 The conditional expression classes from django.db import models clas ...