高质量C++/C编程指南
基本信息
- 作者:林锐 博士
- 版本:v1.0
- 完成日期:2001年7月
- 页数:101页
- 原始路径:
/田浩然上传的资料/电子书/C_C++/高质量C++_C编程指南.pdf
核心内容
本书是华为知名技术专家林锐博士撰写的C++/C编程指南,被誉为”百页经书”。内容涵盖了从文件结构到高级特性的全面编程规范。
第1章 文件结构
- 头文件作用:包含类声明、函数声明、宏定义等
- 目录结构:规范的工程目录组织方式
- 版权和版本声明:文件头部的标准声明格式
第2章 程序的版式
- 空行:用空行分隔逻辑相关的代码段
- 代码行:每行代码不宜过长,一般不超过80列
- 空格:运算符两侧、关键字与括号之间加空格
- 对齐:保持代码的视觉对齐
- 长行拆分:过长的表达式应适当拆分
- 注释:注释要清晰、简洁,解释”为什么”而非”是什么”
第3章 命名规则
- 共性规则:
- 文件名:全小写,用下划线分隔
- 变量名:小写字母开头,混合大小写
- 常量:全大写字母,用下划线分隔
- 类名:大写字母开头,混合大小写
- 函数名:小写字母开头,混合大小写
- Windows应用命名:匈牙利命名法
- UNIX应用命名:下划线分隔
第4章 表达式和基本语句
- 运算符优先级:了解优先级,必要时用括号明确
- 复合表达式:避免过于复杂的复合表达式
- IF语句:
- 比较操作放在左边:
if (x == 0)而非if (0 == x) - 统一使用花括号:即使只有一行代码
- 比较操作放在左边:
- 循环语句的效率:
- 将循环变量初始化放在循环外
- 避免在循环体内进行不必要的计算
- FOR语句:循环控制变量不应在循环体内被修改
- SWITCH语句:每个case后必须有break
- GOTO语句:尽量避免使用
第5章 常量
- 为什么需要常量:提高程序可读性和可维护性
- const与#define的比较:
- const有类型检查,#define没有
- const参与编译,#define是文本替换
- const可调试,#define不可调试
- 常量定义规则:使用const关键字定义常量
第6章 函数设计
- 参数的规则:
- 参数个数不宜过多
- 输入参数用const修饰
- 指针参数前加const
- 返回值的规则:
- 返回指针时检查有效性
- 返回引用时注意生命周期
- 函数内部实现的规则:
- 函数职责单一
- 避免过长的函数
- 使用断言:用assert检查前置条件
第7章 内存管理(核心章节)
- 内存分配方式:
- 从静态存储区分配:全局变量、静态变量
- 从栈上分配:局部变量
- 从堆上分配:动态内存
- 常见的内存错误及其对策:
- 内存分配未成功却使用了它
- 内存分配成功但未初始化
- 内存分配成功且已初始化,但操作越界
- 使用了free或delete释放了内存后仍未置指针为NULL
- 忘记释放内存,造成内存泄漏
- free或delete了非动态内存
- 对同一块动态内存多次释放
- 释放动态内存之后却用它
- 指针与数组的对比:
- sizeof运算符对指针和数组的区别
- 指针算术运算
- 杜绝”野指针”:
- 指针未初始化
- 指针越界
- 指针指向的空间已释放
- malloc/free与new/delete的区别:
- new/delete是运算符,malloc/free是函数
- new/delete会调用构造函数和析构函数
- new/delete返回具体类型,malloc/free返回void*
- new/delete可重载,malloc/free不能
第8章 C++函数的高级特性
- 函数重载的概念:同名不同参
- 成员函数的重载、覆盖与隐藏:
- 重载:同一作用域,同名不同参
- 覆盖:派生类覆盖基类虚函数
- 隐藏:派生类屏蔽基类同名函数
- 参数的缺省值:右侧参数才能有缺省值
- 运算符重载:合理重载,避免滥用
- 函数内联:内联函数避免递归、循环等复杂操作
第9章 类的构造函数、析构函数与赋值函数
- 构造函数的初始化表:效率更高
- 构造和析构的次序:先基类后派生类,先成员后自身
- 拷贝构造函数与赋值函数:
- 必须正确处理深拷贝
- 赋值函数要检查自赋值
- 在派生类中实现基本函数:正确调用基类函数
第10章 类的继承与组合
- 继承:is-a关系,公有继承
- 组合:has-a关系,优先使用组合而非继承
第11章 其它编程经验
- 使用const提高函数健壮性:
- const参数
- const返回值
- const成员函数
- 提高程序效率:
- 用空间换时间
- 减少系统调用
- 避免不必要的计算
- 有益的建议:
- 代码风格一致
- 合理使用宏
- 注释要清晰
附录A:C++/C代码审查表
- 文件结构审查
- 程序版式审查
- 命名规则审查
- 表达式和语句审查
- 常量审查
- 函数设计审查
- 内存管理审查
- C++高级特性审查
- 类的设计审查
附录B:C++/C试题
- 经典面试题,包括:
- sizeof运算符
- 内存分配
- strcpy函数实现
- String类实现
核心观点
- 代码规范是质量的基础:良好的编码规范能显著提高代码可读性和可维护性
- 内存管理是C++的核心难点:正确理解和使用内存管理是区分初级和高级程序员的关键
- const的正确使用:合理使用const可以提高代码安全性和可读性
- 构造函数和析构函数的重要性:正确实现这四个基本函数是类设计的基础
可行动点
- 建立代码审查清单:参考附录A,为团队建立代码审查流程
- 统一命名规范:根据项目平台选择Windows或UNIX命名风格
- 重视内存管理:定期检查内存泄漏和野指针问题
- 合理使用const:在所有可能的地方使用const
与其他知识的关联
- 与Effective-C++-第三版-55条指南互补,前者侧重规范,后者侧重最佳实践
- 与Cpp-Coding-Standards-101条编码规范-Herb-Sutter-Andrei-Alexandrescu.md类似,但更基础
- 与C++-Concurrency-in-Action-中文版.md配合阅读,涵盖从基础到高级的内容