为提高我们的程序品质特将林博士的资料作为我公司程序员的学习教材,请各位读读,
我把我的看法用红字表出,供大家探讨
刘秋实
高质量 C++/C 编程指南
文件标识:
当前版本: 1.0
作 者: 林锐 博士
文件状态
[ ] 草稿文件
[√] 正式文件
[ ] 更改正式文件
完成日期: 2001 年 7 月 24 日
版 本 历 史
版本/状态 作者 参与者 起止日期 备注
V 0.9
草稿文件
林锐
2001-7-1 至
2001-7-18
林锐起草
V 1.0
正式文件
林锐
2001-7-18 至
2001-7-24
朱洪海审查 V 0.9,
林锐修正草稿中的错误
前
言
_______________________________________________________________________ 4
第
1
章
文件结构
____________________________________________________________ 10
1.1 版权和版本的声明 ______________________________________________________ 10
1.2 头文件的结构 __________________________________________________________ 11
1.3 定义文件的结构 ________________________________________________________ 13
1.4 头文件的作用 __________________________________________________________ 14
1.5 目录结构 ______________________________________________________________ 14
第
2
章
程序的版式
__________________________________________________________ 15
2.1 空行 __________________________________________________________________ 15
2.2 代码行 ________________________________________________________________ 16
2.3 代码行内的空格 ________________________________________________________ 17
2.4 对齐 __________________________________________________________________ 19
2.5 长行拆分 ______________________________________________________________ 20
2.6 修饰符的位置 __________________________________________________________ 21
2.7 注释 __________________________________________________________________ 22
2.8 类的版式 ______________________________________________________________ 23
第
3
章
命名规则
____________________________________________________________ 25
3.1 共性规则 ______________________________________________________________ 25
3.2 简单的 Windows 应用程序命名规则 _______________________________________ 27
3.3 简单的 Unix 应用程序命名规则 ___________________________________________ 29
第
4
章
表达式和基本语句
_____________________________________________________ 29
4.1 运算符的优先级 ________________________________________________________ 29
4.2 复合表达式 ____________________________________________________________ 31
4.3 if 语句 ________________________________________________________________ 31
4.4 循环语句的效率 ________________________________________________________ 34
4.5 for 语句的循环控制变量 _________________________________________________ 36
4.6 switch 语句_____________________________________________________________ 36
4.7 goto 语句 ______________________________________________________________ 37
第
5
章
常量
________________________________________________________________ 38
5.1 为什么需要常量 ________________________________________________________ 38
5.2 const 与 #define 的比较 _________________________________________________ 39
5.3 常量定义规则 __________________________________________________________ 39
5.4 类中的常量 ____________________________________________________________ 40
第
6
章
函数设计
____________________________________________________________ 41
6.1 参数的规则 ____________________________________________________________ 42
6.2 返回值的规则 __________________________________________________________ 43
6.3 函数内部实现的规则 ____________________________________________________ 47
6.4 其它建议 ______________________________________________________________ 48
6.5 使用断言 ______________________________________________________________ 49
6.6 引用与指针的比较 ______________________________________________________ 50
第
7
章
内存管理
____________________________________________________________ 52
7.1 内存分配方式___________________________________________________________ 53
7.2 常见的内存错误及其对策_________________________________________________ 53
7.3 指针与数组的对比_______________________________________________________ 55
7.4 指针参数是如何传递内存的?_____________________________________________ 57
7.5 free 和 delete 把指针怎么啦?_____________________________________________ 61
7.6 动态内存会被自动释放吗? ______________________________________________ 62
7.7 杜绝“野指针” __________________________________________________________ 63
7.8 有了 malloc/free 为什么还要 new/delete ? _________________________________ 64
7.9 内存耗尽怎么办? ______________________________________________________ 66
7.10 malloc/free 的使用要点 _________________________________________________ 68
7.11 new/delete 的使用要点__________________________________________________ 70
7.12 一些心得体会 _________________________________________________________ 72
第
8
章
C++
函数的高级特性
___________________________________________________ 72
8.1 函数重载的概念 ________________________________________________________ 72
8.2 成员函数的重载、覆盖与隐藏 ____________________________________________ 76
8.3 参数的缺省值 __________________________________________________________ 82
8.4 运算符重载 ____________________________________________________________ 84
8.5 函数内联 ______________________________________________________________ 85
8.6 一些心得体会 __________________________________________________________ 89
第
9
章类的构造函数、析构函数与赋值函数
______________________________________ 89
9.1 构造函数与析构函数的起源 ______________________________________________ 90
9.2 构造函数的初始化表 ____________________________________________________ 91
9.3 构造和析构的次序 ______________________________________________________ 94
9.4 示例:类 String 的构造函数与析构函数____________________________________ 94
9.5 不要轻视拷贝构造函数与赋值函数 ________________________________________ 95
9.6 示例:类 String 的拷贝构造函数与赋值函数________________________________ 96
9.7 偷懒的办法处理拷贝构造函数与赋值函数 __________________________________ 98
9.8 如何在派生类中实现类的基本函数 ________________________________________ 99
9.9 一些心得体会 _________________________________________________________ 101
第
10
章
类的继承与组合
_____________________________________________________ 102
10.1 继承 ________________________________________________________________ 102
10.2 组合 ________________________________________________________________ 105
第
11
章
其它编程经验
_______________________________________________________ 107
11.1 使用 const 提高函数的健壮性___________________________________________ 107
11.2 提高程序的效率 ______________________________________________________ 111
11.3 一些有益的建议 ______________________________________________________ 111
参考文献
__________________________________________________________________ 113
附录
A
:
C++/C
代码审查表
__________________________________________________ 114
附录
B
:
C++/C
试题
________________________________________________________ 119
附录
C
:
C++/C
试题的答案与评分标准
________________________________________ 125
前 言
软件质量是被大多数程序员挂在嘴上而不是放在心上的东西!
除了完全外行和真正的编程高手外,初读本书,你最先的感受将是惊慌:“哇!我以前
捏造的 C++/C 程序怎么会有那么多的毛病?”
别难过,作者只不过比你早几年、多几次惊慌而已。
请花一两个小时认真阅读这本百页经书,你将会获益匪浅,这是前面 N-1 个读者的建议。
一、编程老手与高手的误区
自从计算机问世以来,程序设计就成了令人羡慕的职业,程序员在受人宠爱之后容易发
展成为毛病特多却常能自我臭美的群体。
如今在 Internet 上流传的“真正”的程序员据说是这样的:
(1) 真正的程序员没有进度表,只有讨好领导的马屁精才有进度表,真正的程序员会让
领导提心吊胆。
(2) 真正的程序员不写使用说明书,用户应当自己去猜想程序的功能。
(3) 真正的程序员几乎不写代码的注释,如果注释很难写,它理所当然也很难读。
(4) 真正的程序员不画流程图,原始人和文盲才会干这事。
(5) 真正的程序员不看参考手册,新手和胆小鬼才会看。
(6) 真正的程序员不写文档也不需要文档,只有看不懂程序的笨蛋才用文档。
(7) 真正的程序员认为自己比用户更明白用户需要什么。
(8) 真正的程序员不接受团队开发的理念,除非他自己是头头。
(9) 真正的程序员的程序不会在第一次就正确运行,但是他们愿意守着机器进行若干个
30 小时的调试改错。
(10)真正的程序员不会在上午 9:00 到下午 5:00 之间工作,如果你看到他在上午 9:00
工作,这表明他从昨晚一直干到现在。
上面的(1)到(10)中大部分的想法是错的,但是程序员无须画框图却是我赞成的。
当然,以简洁的图形描述体系结构是好的方法
具备上述特征越多,越显得水平高,资格老。所以别奇怪,程序员的很多缺点竟然可以
被当作优点来欣赏。就象在武侠小说中,那些独来独往、不受约束且带点邪气的高手最
令人崇拜。我曾经也这样信奉,并且希望自己成为那样的“真正”的程序员,结果没有
得到好下场。
我从读大学到博士毕业十年来一直勤奋好学,累计编写了数十万行 C++/C 代码。有这样
的苦劳和疲劳,我应该称得上是编程老手了吧?
我开发的软件都与科研相关(集成电路 CAD 和 3D 图形学领域),动辄数万行程序,技
术复杂,难度颇高。这些软件频频获奖,有一个软件获得首届中国大学生电脑大赛软件