【读书笔记】《高质量C/C++编程指南》

目录

一、文件结构

二、程序版式

三、命名规则

四、表达式与基本语句

五、常量

六、函数设计

七、内存管理

八、C++高级特性


一、文件结构

  1. 避免头文件被重复引用,用 #pragma once 进行预处理
  2. 用 <> 引用标注库头文件,用 "" 引用自定义库头文件
  3. 头文件的职责应该单一,每一个.c文件应有一个同名的.h文件
  4. C语言头文件只进行函数声明,不进行函数定义;C++类的成员可在声明的同时定义
  5. 禁止在头文件中定义变量,防止重定义
  6. 头文件包含顺序可以从稳定性和字符升序两个角度进行排列,稳定性差(自定义头文件)置于前面在编译报错时可以节约时间,按字符升序排列可以避免头文件重复包含

二、程序版式

  1. 每个类声明、函数定义之后都要加上空行,函数体内可用空行进行逻辑分隔
  2. 一行代码只执行一条语句,if、while、for、case、switch、default 需独占一行,如果 if 语句中有一个分支需要 '{}',则所有分支都需加上 '{}'
  3. 尽可能在定义变量的同时进行初始化,禁止使用未初始化的变量作为右值
  4. 关键字之后留一个空格,函数后面不留空格以区分关键字,操作符视情况留空格
  5. 花括号选择微软风格,即前后花括号各占一行且在同一列
  6. 类的封装“以行为为中心”,将public的函数写在前,将private的数据写在后
  7. 注释与内容之前留一个空格

三、命名规则

  1. 文件:文件命名规则统一使用小写字符,通过“_”分割长命名,原因是考虑不同系统的兼容问题,不同系统对大小写的区分规则不同,故统一采用小写字符
  2. 变量:“名词”或“形容词+名词”命名变量,禁止使用单字符命名变量,允许使用i、j、k作为局部循环变量,除了常用的通用缩写外,不使用单词缩写命名,风格为“小驼峰命名”,即以小写字母开头大写字母分做分割,如 maxVal、stuName
  3. 函数:“动词”或“动词+名词”, 由于系统接口大部分是小写字母加 “_”分割,所以为了避免与系统接口或标准库函数命名冲突,我们的自定义函数统一采用“大驼峰命名法”,即以大写字母开头并以大写字母分割,如 GetVal、IsEmpty
  4. 类与结构体:用大写字母开头的单词组合而成,“大驼峰命名”,例如 Node、ListNode
  5. 常量(宏):全大写字母,用下划线分隔,例如 MAX、MAX_VALUE;定义宏常量时,必须要使用完备的括号
  6. 静态变量:加前缀“s_”
  7. 全局变量:尽量避免使用,使用时加前缀“g_”
  8. 类的数据成员:加前缀“_”

四、表达式与基本语句

  1. 一元运算符的优先级高于二元运算符
  2. 不可将浮点数用 “==” 或 “!=” 与任何数字进行比较,而应该比较精度
  3. 多重循环中,将长循环放内层,短循环放外层,减少cpu跨切循环层的次数
  4. 当逻辑判断嵌套循环语句,先进行逻辑判断再执行循环语句,可提高效率
  5. if 语句应当由 else 结束,所有 switch 语句必须有 default 分支
  6. switch 语句的每个 case 语句都要视条件尽量加上 break,避免多分支重叠
  7. goto 语句存在破坏程序结构化的隐患,慎用,但在多重循环中可直接跳出循环

五、常量

  1. const常量具有数据类型,而宏常量没有数据类型,编译器可对前者进行安全检查
  2. C++程序中完全用const常量取代宏常量
  3. 枚举常量在整个类中都是恒定的常量,不会占用对象的存储空间

六、函数设计

  1. 若参数是不需要修改的值,在类型前面加上const,防止被意外修改
  2. 用 & 引用传参可省去临时对象的构造和析构过程,提高效率
  3. 在函数入口处用 assert 断言检查参数有效性,assert是仅在debug版本起作用的宏
  4. 引用必须被初始化,且不能为空,一旦初始化就不能改变引用的关系

七、内存管理

  1. 动态内存的申请与释放必须配对,malloc/free 和 new/delete,避免内存泄漏
  2. 释放内存之后,将指针置空,避免出现“野指针”
  3. malloc/free 是C/C++标准库函数,new/delete 是C++运算符,new/delete 拥有构造和析构功能
  4. C++代码用 new/delete 取代 malloc/free

八、C++高级特性

  1. 重载:同一个类中,函数名相同,参数不同
  2. 覆盖:派生类与基类中,函数名相同,参数相同,基类必须有vitrual关键字
  3. 隐藏:派生类的函数屏蔽了其同名的基类的函数,注意区别隐藏与覆盖
  4. 当基类与派生类函数同名,若参数相同,基类有virtrual关键字是覆盖,无则是隐藏;若参数不同,则一定是隐藏
  5. 参数缺省值:参数的缺省值只能从后往前逐个进行缺省
  6. 不能被重载的运算符:(1) . (2) ?: (3) .* (4) :: (5)sizeof
  7. C++用内联函数取代宏代码,内联关键字 inline 必须与函数定义放在一起才能生效
目 录 前 言6 第1 章 文件结构 1.1 版权和版本的声明. 1.2 头文件的结构. 1.3 定义文件的结构. 1.4 头文件的作用. 1.5 目录结构. 第2 章 程序的版式 2.1 空行. 2.2 代码行. 2.3 代码行内的空格. 2.4 对齐. 2.5 长行拆分. 2.6 修饰符的位置. 2.7 注释. 2.8 类的版式. 第3 章 命名规则 3.1 共性规则. 3.2 简单的WINDOWS 应用程序命名规则. 3.3 简单的UNIX 应用程序命名规则 第4 章 表达式和基本语句 4.1 运算符的优先级. 4.2 复合表达式. 4.3 IF 语句 4.4 循环语句的效率. 4.5 FOR 语句的循环控制变量. 4.6 SWITCH 语句. 4.7 GOTO 语句. 第5 章 常量 5.1 为什么需要常量. 5.2 CONST 与 #DEFINE 的比较. 5.3 常量定义规则. 5.4 类中的常量. 第6 章 函数设计 高质量C++/C 编程指南,v 1.0 2001 Page 4 of 101 6.1 参数的规则. 6.2 返回值的规则. 6.3 函数内部实现的规则. 6.4 其它建议. 6.5 使用断言. 6.6 引用与指针的比较. 第7 章 内存管理 7.1 内存分配方式 7.2 常见的内存错误及其对策 7.3 指针与数组的对比 7.4 指针参数是如何传递内存的? 7.5 FREE 和DELETE 把指针怎么啦? 7.6 动态内存会被自动释放吗?. 7.7 杜绝“野指针”. 7.8 有了MALLOC/FREE 为什么还要NEW/DELETE ?. 7.9 内存耗尽怎么办?. 7.10 MALLOC/FREE 的使用要点 7.11 NEW/DELETE 的使用要点. 7.12 一些心得体会 第8 章 C++函数的高级特性 8.1 函数重载的概念. 8.2 成员函数的重载、覆盖与隐藏. 8.3 参数的缺省值. 8.4 运算符重载. 8.5 函数内联. 8.6 一些心得体会. 第9 章 类的构造函数、析构函数与赋值函数 9.1 构造函数与析构函数的起源. 9.2 构造函数的初始化表. 9.3 构造和析构的次序. 9.4 示例:类STRING 的构造函数与析构函数 9.5 不要轻视拷贝构造函数与赋值函数. 9.6 示例:类STRING 的拷贝构造函数与赋值函数 9.7 偷懒的办法处理拷贝构造函数与赋值函数. 9.8 如何在派生类中实现类的基本函数. 9.9 一些心得体会. 第10 章 类的继承与组合. 高质量C++/C 编程指南,v 1.0 2001 Page 5 of 101 10.1 继承 10.2 组合 第11 章 其它编程经验. 11.1 使用CONST 提高函数的健壮性 11.2 提高程序的效率 11.3 一些有益的建议 参考文献 附录A :C++/C 代码审查表. 附录B :C++/C 试题. 附录C :C++/C 试题的答案与评分标准.
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AllinTome

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值