高质量程序设计指南:C++/C语言.pdf

高质量程序设计指南:C++/C语言.pdf
 

书籍描述

编辑推荐
《高质量程序设计指南:C++/C语言(第3版)(修订版)》的主要读者对象是IT企业的程序员和项目经理,以及大专院校的本科生和研究生。

名人推荐
在中国,我很欣赏以至于崇拜的一个人便是林锐先生了。我写文章时经常引用他的话——“作一个优秀、正直、诚实的人,为中国软件产业的振兴而努力!”他的这本书颇有经典外版书的特征,集幽默与严谨于一身,很少有书能如此吸引我。诚然,它不是一本“巨著”,但却是学习C++过程中可以让你享受,或停下来思考的一本书。你不必像看《C++编程思想》一样慢而稳地看这本书,你甚至可以一下午就搞定它,但它却是一本你最好能拥有的书。
——@ouyangj0
林锐先生的书是在你懂了一些语言之后,教给你一些真正做项目要注意的问题。对学过C语言9DC++N言而没有参与过大项目的学生以及刚参加编程工作的研发人员来说,都有较强参考价值。即使是有多年编程工作经验的人,也建议你翻一下。
——@macogg
这本书读了两年多,当这些东西经潜移默化成为本能时,的确对高质量的产品设计起到了不少作用!
——@gavin.mu
绝对是一本好书,让我弄懂了很多以前困惑的问题。总体感觉,这本书不是一本入门教材,也不是一本像《Inside The C++Object Model》一样深奥的典籍,它更像两者之间的一个梯子,让已经有一定基础的读者经由它爬上能够理解《Inside The C++Object Model》的高度。
——@smartm
看过第一版和第二版,堪称中国本土版的《Effective C++》和《More Effective C++》。
——@cn_lb
一口气读完,如饮甘饴。作者把个人的社会责任感融注于一本技术性书籍当中,语言风趣,文字简洁,读起来别有一番风味。老外的书大多不符合中国人的语言习惯,读起来很晦涩,这本书把中文运用得很好。
——@SED

媒体推荐
    @ouyangj0:在中国,我很欣赏以至于崇拜的一个人便是林锐先生了。我写文章时经常引用他的话——“作一个优秀、正直、诚实的人,为中国软件产业的振兴而努力!”他的这本书颇有经典外版书的特征,集幽默与严谨于一身,很少有书能如此吸引我。诚然,它不是一本“巨著”,但却是学习C++过程中可以让你享受,或停下来思考的一本书。你不必像看《C++编程思想》一样慢而稳地看这本书,你甚至可以一下午就搞定它,但它却是一本你最好能拥有的书。

    @macogg:林锐先生的书是在你懂了一些语言之后,教给你一些真正做项目要注意的问题。对学过C语言和C++语言而没有参与过大项目的学生以及刚参加编程工作的研发人员来说,都有较强参考价值。即使是有多年编程工作经验的人,也建议你翻一下。

    @gavin.mu:这本书读了两年多,当这些东西经潜移默化成为本能时,的确对高质量的产品设计起到了不少作用!

    @smartm:绝对是一本好书,让我弄懂了很多以前困惑的问题。总体感觉,这本书不是一本入门教材,也不是一本像《Inside The C++ Object Model》一样深奥的典籍,它更像两者之间的一个梯子,让已经有一定基础的读者经由它爬上能够理解《Inside The C++ Object Model》的高度。

    @cn_lb:看过第一版和第二版,堪称中国本土版的《Effective C++》和《More Effective C++》。

    @SED:一口气读完,如饮甘饴。作者把个人的社会责任感融注于一本技术性书籍当中,语言风趣,文字简洁,读起来别有一番风味。老外的书大多不符合中国人的语言习惯,读起来很晦涩,这本书把中文运用得很好。

    

作者简介
林锐,1973年生。1994年和1996年获西安电子科技大学应用物理学士学位和微电子硕士学位,2000年获浙江大学计算机应用博士学位。大学期间两度被评为中国百名跨世纪优秀大学生,1996年获电子工业部科技进步二等奖,1997年获首届中国大学生电脑大赛软件一等奖。2000年7月加入上海贝尔有限公司,从事软件工程、项目管理和CMM的研究推广工作,2003年7月当选为Alcatel集团技术专家(Alcatel集团授予为保持全球技术领先地位做出突出贡献的技术专家荣誉和资格)。2004年初创建上海漫索计算机科技有限公司,致力于创作适合国内软件企业需求的管理方法论和软件产品。从2000年至今,林锐博士在程序设计、用户界面设计、软件工程、项目管理、CMMl与软件过程改进、IT企业研发管理、软件企业管理等领域累计出版著作十部,拥有数十万名读者,成为国内软件企业管理方法论的领先者。
韩永泉,1975年生。1994年至2001年就读于西安电子科技大学计算机系,获硕士学位。2001年4月加入上海大唐移动通信技术有限公司,担任高级软件工程师,从事电信设备网管软件的研发工作。2004年加入北京新岸线软件科技有限公司,从事数字电视和手机电视相关软件产品的设计、开发和研发管理工作,曾负责所在公司与上海漫索计算机科技有限公司合作开展的软件过程改进和研发管理解决方案的实施项目。2010年加入诺基亚西门子(NSN)。面向对象和面向组件软件开发技术及编程技术的爱好者。

目录
第1章高质量软件开发之道1
11软件质量基本概念1
111如何理解软件的质量1
112提高软件质量的基本方法2
113“零缺陷”理念4
12细说软件质量属性4
121正确性4
122健壮性4
123可靠性5
124性能6
125易用性6
126清晰性7
127安全性7
128可扩展性8
129兼容性8
1210可移植性8
13人们关注的不仅仅是质量9
131质量、生产率和成本之间的关系9
132软件过程改进的基本概念10
14高质量软件开发的基本方法13
141建立软件过程规范13
142复用15
143分而治之16
144优化与折中17
145技术评审17
146测试19
147质量保证21
148改错22
15关于软件开发的一些常识和思考23
151有最好的编程语言吗23
152编程是一门艺术吗23
153编程时应该多使用技巧吗24
154换更快的计算机还是换更快的算法24
155错误是否应该分等级24
156一些错误的观念25
16小结25
第2章编程语言发展简史27
21编程语言大事记27
22Ada的故事31
23C/C++发展简史31
24Borland与Microsoft之争32
25Java阵营与Microsoft的较量33
26小结36
第3章程序的基本概念37
31程序设计语言37
32语言实现38
33程序库40
34开发环境40
35程序的工作原理41
36良好的编程习惯42
第4章C++/C程序设计入门45
41C++/C程序的基本概念45
411启动函数main()45
412命令行参数47
413内部名称48
414连接规范49
415变量及其初始化51
416CRuntimeLibrary52
417编译时和运行时的不同52
418编译单元和独立编译技术54
42基本数据类型和内存映像54
43类型转换56
431隐式转换56
432强制转换58
44标识符60
45转义序列61
46运算符62
47表达式63
48基本控制结构65
49选择(判断)结构65
491布尔变量与零值比较66
492整型变量与零值比较67
493浮点变量与零值比较67
494指针变量与零值比较69
495对if语句的补充说明69
496switch结构70
410循环(重复)结构71
4101for语句的循环控制变量72
4102循环语句的效率73
411结构化程序设计原理78
412goto/continue/break语句79
413示例79
第5章C++/C常量85
51认识常量85
511字面常量85
512符号常量86
513契约性常量87
514枚举常量87
52正确定义符号常量87
53const与#define的比较88
54类中的常量89
55实际应用中如何定义常量90
第6章C++/C函数设计基础95
61认识函数95
62函数原型和定义96
63函数调用方式97
64认识函数堆栈99
65函数调用规范100
66函数连接规范101
67参数传递规则102
68返回值的规则104
69函数内部实现的规则107
610存储类型及作用域规则109
6101存储类型109
6102作用域规则110
6103连接类型111
611递归函数113
612使用断言116
613使用const提高函数的健壮性118
6131用const修饰函数的参数118
6132用const修饰函数的返回值119
第7章C++/C指针、数组和字符串121
71指针121
711指针的本质121
712指针的类型及其支持的运算123
713指针传递125
72数组126
721数组的本质126
722二维数组128
723数组传递129
724动态创建、初始化和删除数组的方法131
73字符数组、字符指针和字符串133
731字符数组、字符串和'\0'的关系133
732字符指针的误区134
733字符串拷贝和比较134
74函数指针134
75引用和指针的比较137
第8章C++/C高级数据类型141
81结构(struct)141
811关键字struct与class的困惑141
812使用struct142
813位域145
814成员对齐147
82联合(Union)159
83枚举(Enum)161
84文件162
第9章C++/C编译预处理165
91文件包含165
911内部包含卫哨和外部包含卫哨165
912头文件包含的合理顺序166
92宏定义166
93条件编译169
931#if、#elif和#else169
932#ifdef和#ifndef170
94#error170
95#pragma171
96#和##运算符171
97预定义符号常量172
第10章C++/C文件结构和程序版式173
101程序文件的目录结构173
102文件的结构174
1021头文件的用途和结构174
1022版权和版本信息175
1023源文件结构176
103代码的版式176
1031适当的空行176
1032代码行及行内空格177
1033长行拆分178
1034对齐与缩进179
1035修饰符的位置180
1036注释风格180
1037ADT/UDT版式181
第11章C++/C应用程序命名规则183
111共性规则183
112简单的Windows应用程序命名184
第12章C++面向对象程序设计方法概述187
121漫谈面向对象187
122对象的概念188
123信息隐藏与类的封装189
124类的继承特性193
125类的组合特性199
126动态特性200
1261虚函数200
1262抽象基类201
1263动态绑定203
1264运行时多态206
1265多态数组207
127C++对象模型214
1271对象的内存映像214
1272隐含成员224
1273C++编译器如何处理成员函数225
1274C++编译器如何处理静态成员225
128小结226
第13章对象的初始化、拷贝和析构229
131构造函数与析构函数的起源229
132为什么需要构造函数和析构函数230
133构造函数的成员初始化列表232
134对象的构造和析构次序234
135构造函数和析构函数的调用时机235
136构造函数和赋值函数的重载236
137示例:类String的构造函数和析构函数238
138何时应该定义拷贝构造函数和拷贝赋值函数239
139示例:类String的拷贝构造函数和拷贝赋值函数240
1310用偷懒的办法处理拷贝构造函数和拷贝赋值函数242
1311如何实现派生类的基本函数243
第14章C++函数的高级特性247
141函数重载的概念247
1411重载的起源247
1412重载是如何实现的247
1413小心隐式类型转换导致重载函数产生二义性249
142成员函数的重载、覆盖与隐藏250
1421重载与覆盖250
1422令人迷惑的隐藏规则251
1423摆脱隐藏253
143参数的默认值254
144运算符重载255
1441基本概念255
1442运算符重载的特殊性256
1443不能重载的运算符257
1444重载++和--257
145函数内联259
1451用函数内联取代宏259
1452内联函数的编程风格260
1453慎用内联261
146类型转换函数261
147const成员函数264
第15章C++异常处理和RTTI267
151为什么要使用异常处理267
152C++异常处理268
1521异常处理的原理268
1522异常类型和异常对象269
1523异常处理的语法结构270
1524异常的类型匹配规则272
1525异常说明及其冲突272
1526当异常抛出时局部对象如何释放273
1527对象构造和析构期间的异常273
1528如何使用好异常处理技术275
1529C++的标准异常278
153虚函数面临的难题278
154RTTI及其构成280
1541起源280
1542typeid运算符281
1543dynamic_cast<>运算符283
1544RTTI的魅力与代价285
第16章内存管理287
161内存分配方式287
162常见的内存错误及其对策288
163指针参数是如何传递内存的289
164free和delete把指针怎么啦291
165动态内存会被自动释放吗292
166杜绝“野指针”292
167有了malloc/free为什么还要new/delete293
168malloc/free的使用要点295
169new有3种使用方式296
1691plainnew/delete296
1692nothrownew/delete297
1693placementnew/delete297
1610new/delete的使用要点300
1611内存耗尽怎么办301
1612用对象模拟指针302
1613泛型指针auto_ptr305
1614带有引用计数的智能指针306
1615智能指针作为容器元素312
第17章学习和使用STL323
171STL简介323
172STL头文件的分布324
1721容器类324
1722泛型算法325
1723迭代器325
1724数学运算库325
1725通用工具325
1726其他头文件326
173容器设计原理326
1731内存映像326
1732存储方式和访问方式327
1733顺序容器和关联式容器的比较328
1734如何遍历容器331
1735存储空间重分配问题332
1736什么样的对象才能作为STL容器的元素333
174迭代器334
1741迭代器的本质334
1742迭代器失效及其危险性337
1743如何在遍历容器的过程中正确删除元素346
175存储分配器347
176适配器349
177泛型算法352
178一些特殊的容器355
1781string类356
1782bitset并非set356
1783节省存储空间的vector<bool>358
1784空容器360
179STL容器特征总结361
1710STL使用心得364
附录AC++/C试题367
附录BC++/C试题答案与评分标准371
附录C大学十年377
附录D《大学十年》后记395
附录E术语与缩写解释397

文摘
版权页:

高质量程序设计指南:C++/C语言

插图:

高质量程序设计指南:C++/C语言

1.5.3编程时应该多使用技巧吗
作者的观点:就软件开发而言,技巧的优点在于能另辟蹊径地解决一些问题,缺点是技巧并不为人熟知。若在程序中使用太多的技巧,可能会留下错误隐患,别人也难以理解。一个局部的优点对整个系统而言是微小的,而一个错误则可能对整个系统是致命的。我建议用自然的方式编程,不要滥用技巧。我们有时的确不知道自己的得意之举究竟是锦上添花,还是画蛇添足。就像蒸出一笼馒头,在上面插一朵鲜花,本想弄点诗情画意,却让人误以为那是一堆热气腾腾的牛粪。
小时候读的《狼三则》故事启示我们,失败的技巧被讽刺为“伎俩”。当我们编程时无法判断用的是技巧还是伎俩的情况下,那就少用。《卖油翁》的故事又告诉我们“熟能生巧”,表明技巧是自然而然产生的,不是卖弄出来的。
1.5.4换更快的计算机还是换更快的算法
如果软件运行较慢,是换一台更快的计算机,还是设计一种更快的算法?
作者的观点:如果开发软件的目的是为了学习或是研究,那么应该设计一种更快的算法。如果该软件已经用于商业,则需谨慎考虑。若换一台更快的计算机能解决问题,则是最快的解决方案。改进算法虽然可以从根本上提高软件的运行速度,但可能引入错误并延误进度。
技术狂毫无疑问会选择后者,因为他们觉得放弃任何可以优化的机会就等于犯罪。类似的争议还有:是买现成的程序,还是彻底由自己开发?技术人员和商业人士常常会有不同的决策。
1.5.5错误是否应该分等级
微软的一些开发小组将错误分成以下4个等级(Cusumano,P354~P355)。
一级严重:错误导致软件崩溃。
二级严重:错误导致一个特性不能运行并且没有替代方案。
三级严重:错误导致一个特性不能运行但有替代方案。
四级严重:错误是表面化的或是微小的。
作者的观点:将错误分等级的好处是便于统计分析,仅此而已。但上述分类带有较重的技术倾向,并不是普遍适用的。假设某个财务软件有两个错误:错误A使该软件死掉,错误B导致工资计算错误。按上述分类,错误A属一级严重,错误B属二级严重。但事实上B要比A严重。工资算多了或者算少了,将会使老板或员工遭受经济损失。而错误A只是使操作员感到厌烦,并没有造成经济损失。再例如航空软件操作手册写错了,按上述分类则属四级严重,但这种错误可能导致机毁人亡,难道还算微小吗?
开发人员应该意识到:所有的错误都是严重的,不存在微不足道的错误。只有这样才能少犯错误。

内容简介
《高质量程序设计指南:C++/C语言(第3版)(修订版)》以轻松幽默的笔调向读者论述了高质量软件开发方法与C++/C编程规范,而这也是作者多年从事软件开发工作的经验总结。全书共17章,第1章到第4章重点介绍软件质量和基本的程序设计方法;第5章到第16章重点阐述C++/C编程风格、面向对象程序设计方法和一些技术专题;第17章阐述STL的原理和使用方法。

购买书籍

当当网购书 京东购书 卓越购书

PDF电子书下载地址

相关书籍

搜索更多