[2014-11-24]高质量C++C编程指南 - 阅读笔记

  1. C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:

    • const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
    • 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
  2. 需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。
  3. 不能在类声明中初始化const数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道SIZE的值是什么。

    class A

    {…

    const int SIZE = 100; // 错误,企图在类声明中初始化const数据成员

    int array[SIZE]; // 错误,未知的SIZE

    };

  4. const数据成员的初始化只能在类构造函数的初始化表中进行
  5. 断言assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况。
  6. assert不是函数,而是宏。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。如果程序在assert处终止了,并不是说含有该assert的函数有错误,而是调用者出了差错,assert可以帮助我们找到发生错误的原因。
  7. 引用的一些规则如下:

    (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。

    (2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。

    (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

  8. 内存分配方式有三种:
      (1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

      (2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

      (3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

  9. 如果函数的参数是一个指针,不要指望用该指针去申请动态内存。
  10. 如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,
  11. 由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。
  12. 不要用return语句返回指向“栈内存”的指针
  13. (1)指针消亡了,并不表示它所指的内存会被自动释放。

    (2)内存被释放了,并不表示指针会消亡或者成了NULL指针。
  14. “野指针”不是NULL指针,是指向“垃圾”内存的指针。
  15. “野指针”的成因主要有两种:

    (1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

    (2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。

  16. 通常有三种方式处理“内存耗尽”问题:
    • 判断指针是否为NULL,如果是则马上用return语句终止本函数。
    • 判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行。
    • 为new和malloc设置异常处理函数。
  17. 对于32位以上的应用程序,“内存耗尽”错误处理程序毫无用处。因为32位操作系统支持“虚存”,内存用完了,自动用硬盘空间顶替。

  18. 所有的一元运算符


    建议重载为成员函数


    = () [] ->


    只能重载为成员函数


    += -= /= *= &= |= ~= %= >>= <<=


    建议重载为成员函数


    所有其它运算符


    建议重载为全局函数

  19. 预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而提高了速度。使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应。
  20. 在C++ 程序中,应该用内联函数取代所有宏代码,“断言assert”恐怕是唯一的例外。
  21. 定义在类声明之中的成员函数将自动地成为内联函数
  22. C++编译器将自动为A产生四个缺省的函数,如
  23. A(void); // 缺省的无参数构造函数

    A(const A &a); // 缺省的拷贝构造函数

    ~A(void); // 缺省的析构函数

    A & operate =(const A &a); // 缺省的赋值函数

    (1)如果使用“缺省的无参数构造函数”和“缺省的析构函数”,等于放弃了自主“初始化”和“清除”的机会,C++发明人Stroustrup的好心好意白费了。

    (2)“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。

时间: 2024-08-03 11:45:37

[2014-11-24]高质量C++C编程指南 - 阅读笔记的相关文章

《高质量C\C++编程》阅读笔记 第一章

第一章 文件结构 分为两个文件 1.头文件:保存程序的声明. C/C++都是".h"为后缀 2.定义文件:保存程序的实现. C ".c"为后缀,C++ ".cpp"为后缀 1.1 版权和版本的说明 位置:头文件和定义文件的开头.(版本信息)(文件名称.标识符.摘要)(当前版本号.作者.完成日期)(版本历史信息). 1.2 头文件的结构 <xxxx.h> 三部分: 1.版本和版本声明. 2.预处理块. 3.函数和类结构声明. ifnde

高质量C++/C编程指南_读书笔记1

----------------------------------------------------------------------------- 引用和指针 ----------------------------------------------------------------------------- 以下程序中,n是m的一个引用(reference),m是被引用物(referent). int m; int &n = m; n相当于m的别名(绰号),对n的任何操作就是对m的

高质量C++/C编程指南

http://man.chinaunix.net/develop/c&c++/c/c.htm#_Toc520634042 文件状态 [  ] 草稿文件 [√] 正式文件 [  ] 更改正式文件 文件标识: 当前版本: 1.0 作    者: 林锐 博士 完成日期: 2001年7月24日 版 本 历 史 版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐 2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐 2001-7-18至 2001-7-24 朱洪海

《高质量C++/C编程指南》

基本功: 编程风格 出错处理 算法复杂度分析 头文件的作用: 通过头文件来调用库功能.在很多场合,源代码不便向用户公布,只要向用户提供头文件和二进制的库即可.头文件相当于向外提供接口. 加强类型检查.声明与定义不一致会“警告”. 风格问题: 一行代码只做一件事,如只定义一个变量,只写一条语句 尽可能在定义变量的同时初始化变量,防止引用未被初始化的变量 长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符) 应当将修饰符*和&紧靠变量名. 例:          char*n

高质量c c++编程

第1章 文件结构 每一个C++/C程序通常分为两个文件.一个文件用于保存程序的声明(declaration),称为头文件.还有一个文件用于保存程序的实现(implementation),称为定义(definition)文件. C++/C程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀,C++程序的定义文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀). 1.1版权和版本号的声明 版权和版本号的声明位于头文件和定义文件的开头(參见演示样例1-1),主要内容有

《C++/C高质量编程指南》笔记

复习: C/C++高质量编程指南: [规则1-2-1]为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块. [规则1-2-2]用 #include <filename.h> 格式来引用标准库的头文件(编译器将从标准库目录开始搜索). [规则1-2-3]用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索). [建议1-2-1]头文件中只存放“声明”而不存放“定义” [规则2-2-1]一行代码只做一件事情

Linux Unix shell 编程指南学习笔记(第一部分)

第一章:文件安全与权限: 1.文件和目录的权限 创建文件时系统保存了文件所有相关的信息,包括 文件的位置 . 文件类型 . 文件长度 . 哪位用户拥有该文件,哪些用户可以访问该文件 . i 节点 . 文件的修改时间 . 文件的权限位 . 文件类型: d: 目录 l : 符号链接(指向另一个文件) s: 套接字文件 b: 块设备文件 c: 字符设备文件 p: 命名管道文件 -: 不属于上述类型的文件 文件权限 XXX       XXX        XXX 最左边 XXX : 文件属主 权限位

Hive编程指南学习笔记(2)

我们可以使用describe extended financial.employee命令来查看这个表的详细表结构信息(如果当前所处的工作数据库就是financial,那可以不佳finanacial). 如果使用formatted替代关键字extended的话,那可以得到更多的输出信息. 如果用户只想查看某一列的信息,那么只要在表名后增加这个字段的名称即可.这种情况下,使用extended关键字也不会增加更多的输出信息: hive> describe financial.employee.sala

2014/11/24 总结

1. 以前遇到问题都是想:把这个问题放到下次吧,或者我以前没学过,所以找借口了,所以就逃避了. 解决办法:遇到问题就去努力解决,不去找借口.遇到问题不能拖,拖久了肯定不会再去做了.遇到问题去钻研. 2. 做笔记: 记录每天主要的事情,每天所学内容.主要是详细的写blog.把一段时间所学所思记载下. 当然还有每天自己的一些做人做事不稳妥的地方,也在晚上记下(这个比较困难了,我努力啊). 3. 工作态度问题 这是一个比较难以解决的问题,如何态度更努力,很难量化!但是有一点可以肯定:那就是很多时候我们