zoukankan      html  css  js  c++  java
  • 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++语言

    Exceptional C++ 47

  • 相关阅读:
    MS面试归来:)
    准备出发到成都
    线程的同步机制(zz)
    Windows Vista(zz)
    这几天上海热晕了
    微软官方:Vista硬件要求指南(zz)
    有趣的递归缩写(Recursive acronym)
    《三国志》生僻人名读法集(zz)
    Git bash常用命令
    各大输入法分类词库内部格式的简单比较
  • 原文地址:https://www.cnblogs.com/iamgoodman/p/3503508.html
Copyright © 2011-2022 走看看