| 作 者: | 林锐;韩永泉 [同作者作品] | |||||
|---|---|---|---|---|---|---|
| I S B N: | 7121041146 | |||||
| 出 版 社: | 电子工业 | |||||
| 定 价: | 39.8元 | |||||
| 现 卖 价: |
35.0 元(1星会员价) 34.6 元(2星会员价) 33.8 元(3星会员价) |
|||||
| 高质量程序设计是软件行业的薄弱环节,大部分企业只能依靠大量的测试和改错来提高软件产品的质量,为此付出了高昂的代价。因此,如何让程序员熟练地掌握编程技术和编程规范,在开发过程中内建高质量代码,是IT企业面临的主要挑战之一。 |
| 本书以轻松幽默的笔调向读者论述了高质量软件开发方法与C++/C编程规范。它是作者多年从事软件开发工作的经验总结。本书共17章,第1章到第4章重点介绍软件质量和基本的程序设计方法;第5章到第16章重点阐述C++/C编程风格、面向对象程序设计方法和一些技术专题;第17章阐述STL的原理和使用方法。. |
| 本书第1版和第2版部分章节曾经在Internet上广泛流传,被国内IT企业的不少软件开发人员采用。本书的附录C《大学十年》是作者在网上发表的一个短篇传记,文中所描述的充满激情的学习和生活态度,感染了大批莘莘学子。.. |
| 本书的主要读者对象是IT企业的程序员和项目经理,以及大专院校的本科生和研究生。... |
| 第1章高质量软件开发之道. 1 |
| 1.1软件质量基本概念 1 |
| 1.1.1如何理解软件的质量 1 |
| 1.1.2提高软件质量的基本方法 3 |
| 1.1.3“零缺陷”理念 4 |
| 1.2细说软件质量属性 4 |
| 1.2.1正确性 4 |
| 1.2.2健壮性 5 |
| 1.2.3可靠性 5 |
| 1.2.4性能 6 |
| 1.2.5易用性 7 |
| 1.2.6清晰性 7 |
| 1.2.7安全性 7 |
| 1.2.8可扩展性 8 |
| 1.2.9兼容性 8 |
| 1.2.10可移植性 8 |
| 1.3人们关注的不仅仅是质量 9 |
| 1.3.1质量.生产率和成本之间的关系 9 |
| 1.3.2软件过程改进的基本概念 11 |
| 1.4高质量软件开发的基本方法 13 |
| 1.4.1建立软件过程规范 13 |
| 1.4.2复用 15 |
| 1.4.3分而治之 16 |
| 1.4.4优化与折中 17 |
| 1.4.5技术评审 18 |
| 1.4.6测试 19 |
| 1.4.7质量保证 21 |
| 1.4.8改错 22 |
| 1.5关于软件开发的一些常识和思考 24 |
| 1.5.1有最好的编程语言吗 24 |
| 1.5.2编程是一门艺术吗 24 |
| 1.5.3编程时应该多使用技巧吗 24 |
| 1.5.4换更快的计算机还是换更快的算法 25 |
| 1.5.5错误是否应该分等级 25 |
| 1.5.6一些错误的观念 25 |
| 1.6小结 26 |
| 第2章编程语言发展简史 27 |
| 2.1编程语言大事记 27 |
| 2.2Ada的故事 30 |
| 2.3C/C++发展简史 31 |
| 2.4Borland与Microsoft之争 32 |
| 2.5Java阵营与Microsoft的较量 33 |
| 2.6小结 36 |
| 第3章程序的基本概念 37 |
| 3.1程序设计语言 37 |
| 3.2语言实现 38 |
| 3.3程序库 40 |
| 3.4开发环境 40 |
| 3.5程序的工作原理 41 |
| 3.6良好的编程习惯 42 |
| 第4章C++/C程序设计入门 45 |
| 4.1C++/C程序的基本概念 45 |
| 4.1.1启动函数main() 45 |
| 4.1.2命令行参数 47 |
| 4.1.3内部名称 48 |
| 4.1.4连接规范 49 |
| 4.1.5变量及其初始化 51 |
| 4.1.6CRuntimeLibrary 52 |
| 4.1.7编译时和运行时的不同 52 |
| 4.1.8编译单元和独立编译技术 54 |
| 4.2基本数据类型和内存映像 54 |
| 4.3类型转换 56 |
| 4.3.1隐式转换 56 |
| 4.3.2强制转换 58 |
| 4.4标识符 60 |
| 4.5转义序列 61 |
| 4.6运算符 62 |
| 4.7表达式 63 |
| 4.8基本控制结构 65 |
| 4.9选择(判断)结构 65 |
| 4.9.1布尔变量与零值比较 66 |
| 4.9.2整型变量与零值比较 67 |
| 4.9.3浮点变量与零值比较 67 |
| 4.9.4指针变量与零值比较 69 |
| 4.9.5对if语句的补充说明 70 |
| 4.9.6switch结构 70 |
| 4.10循环(重复)结构 71 |
| 4.10.1for语句的循环控制变量 72 |
| 4.10.2循环语句的效率 73 |
| 4.11结构化程序设计原理 78 |
| 4.12goto/continue/break语句 79 |
| 4.13示例 80 |
| 第5章C++/C常量 85 |
| 5.1认识常量 85 |
| 5.1.1字面常量 85 |
| 5.1.2符号常量 86 |
| 5.1.3契约性常量 87 |
| 5.1.4枚举常量 87 |
| 5.2正确定义符号常量 87 |
| 5.3const与#define的比较 88 |
| 5.4类中的常量 89 |
| 5.5实际应用中如何定义常量 90 |
| 第6章C++/C函数设计基础 95 |
| 6.1认识函数 95 |
| 6.2函数原型和定义 96 |
| 6.3函数调用方式 97 |
| 6.4认识函数堆栈 99 |
| 6.5函数调用规范 100 |
| 6.6函数连接规范 101 |
| 6.7参数传递规则 102 |
| 6.8返回值的规则 104 |
| 6.9函数内部实现的规则 107 |
| 6.10存储类型及作用域规则 109 |
| 6.10.1存储类型 109 |
| 6.10.2作用域规则 110 |
| 6.10.3连接类型 111 |
| 6.11递归函数 113 |
| 6.12使用断言 116 |
| 6.13使用const提高函数的健壮性 118 |
| 6.13.1用const修饰函数的参数 118 |
| 6.13.2用const修饰函数的返回值 119 |
| 第7章C++/C指针.数组和字符串 121 |
| 7.1指针 121 |
| 7.1.1指针的本质 121 |
| 7.1.2指针的类型及其支持的运算 123 |
| 7.1.3指针传递 125 |
| 7.2数组 126 |
| 7.2.1数组的本质 126 |
| 7.2.2二维数组 128 |
| 7.2.3数组传递 129 |
| 7.2.4动态创建.初始化和删除数组的方法 131 |
| 7.3字符数组.字符指针和字符串 133 |
| 7.3.1字符数组.字符串和‘\0’的关系 133 |
| 7.3.2字符指针的误区 134 |
| 7.3.3字符串拷贝和比较 134 |
| 7.4函数指针 135 |
| 7.5引用和指针的比较 137 |
| 第8章C++/C高级数据类型 141 |
| 8.1结构(Struct) 141 |
| 8.1.1关键字struct与class的困惑 141 |
| 8.1.2使用struct 142 |
| 8.1.3位域 145 |
| 8.1.4成员对齐 147 |
| 8.2联合(Union) 159 |
| 8.3枚举(Enum) 161 |
| 8.4文件 163 |
| 第9章C++/C编译预处理 165 |
| 9.1文件包含 165 |
| 9.1.1内部包含卫哨和外部包含卫哨 165 |
| 9.1.2头文件包含的合理顺序 166 |
| 9.2宏定义 166 |
| 9.3条件编译 169 |
| 9.3.1#if.#elif和#else 169 |
| 9.3.2#ifdef和#ifndef 170 |
| 9.4#error 171 |
| 9.5#pragma 171 |
| 9.6#和##运算符 171 |
| 9.7预定义符号常量.. 172 |
| 第10章C++/C文件结构和程序版式 175 |
| 10.1程序文件的目录结构 175 |
| 10.2文件的结构 176 |
| 10.2.1头文件的用途和结构 176 |
| 10.2.2版权和版本信息 177 |
| 10.2.3源文件结构 178 |
| 10.3代码的版式 178 |
| 10.3.1适当的空行 178 |
| 10.3.2代码行及行内空格 179 |
| 10.3.3长行拆分 180 |
| 10.3.4对齐与缩进 181 |
| 10.3.5修饰符的位置 182 |
| 10.3.6注释风格 182 |
| 10.3.7ADT/UDT版式 183 |
| 第11章C++/C应用程序命名规则 185 |
| 11.1共性规则 185 |
| 11.2简单的Windows应用程序命名 186 |
| 第12章C++面向对象程序设计方法概述 189 |
| 12.1漫谈面向对象 189 |
| 12.2对象的概念 190 |
| 12.3信息隐藏与类的封装 191 |
| 12.4类的继承特性 195 |
| 12.5类的组合特性 200 |
| 12.6动态特性 201 |
| 12.6.1虚函数 202 |
| 12.6.2抽象基类 202 |
| 12.6.3动态绑定 205 |
| 12.6.4运行时多态 207 |
| 12.6.5多态数组 208 |
| 12.7C++对象模型 215 |
| 12.7.1对象的内存映像 215 |
| 12.7.2隐含成员 224 |
| 12.7.3C++编译器如何处理成员函数 225 |
| 12.7.4C++编译器如何处理静态成员 225 |
| 12.8小结 226 |
| 第13章对象的初始化.拷贝和析构 229 |
| 13.1构造函数与析构函数的起源 229 |
| 13.2为什么需要构造函数和析构函数 230 |
| 13.3构造函数的成员初始化列表 232 |
| 13.4对象的构造和析构次序 234 |
| 13.5构造函数和析构函数的调用时机 235 |
| 13.6构造函数和赋值函数的重载 236 |
| 13.7示例:类String的构造函数和析构函数 238 |
| 13.8何时应该定义拷贝构造 |
| 函数和拷贝赋值函数 239 |
| 13.9示例:类String的拷贝构造函数和拷贝赋值函数 240 |
| 13.10用偷懒的办法处理拷贝构造函数和拷贝赋值函数 242 |
| 13.11如何实现派生类的基本函数 243 |
| 第14章C++函数的高级特性 247 |
| 14.1函数重载的概念 247 |
| 14.1.1重载的起源 247 |
| 14.1.2重载是如何实现的 247 |
| 14.1.3当心隐式类型转换导致重载函数产生二义性 249 |
| 14.2成员函数的重载.覆盖与隐藏 250 |
| 14.2.1重载与覆盖 250 |
| 14.2.2令人迷惑的隐藏规则 251 |
| 14.2.3摆脱隐藏 253 |
| 14.3参数的默认值 254 |
| 14.4运算符重载 255 |
| 14.4.1基本概念 255 |
| 14.4.2运算符重载的特殊性 256 |
| 14.4.3不能重载的运算符 257 |
| 14.4.4重载++和-- 257 |
| 14.5函数内联 259 |
| 14.5.1用函数内联取代宏 259 |
| 14.5.2内联函数的编程风格 260 |
| 14.5.3慎用内联 261 |
| 14.6类型转换函数 261 |
| 14.7const成员函数 264 |
| 第15章C++异常处理和RTTI 267 |
| 15.1为什么要使用异常处理 267 |
| 15.2C++异常处理 268 |
| 15.2.1异常处理的原理 268 |
| 15.2.2异常类型和异常对象 269 |
| 15.2.3异常处理的语法结构 270 |
| 15.2.4异常的类型匹配规则 272 |
| 15.2.5异常说明及其冲突 272 |
| 15.2.6当异常抛出时局部对象如何释放 273 |
| 15.2.7对象构造和析构期间的异常 273 |
| 15.2.8如何使用好异常处理技术 275 |
| 15.2.9C++的标准异常 278 |
| 15.3虚函数面临的难题 278 |
| 15.4RTTI及其构成 280 |
| 15.4.1起源 280 |
| 15.4.2typeid运算符 281 |
| 15.4.3dynamic_cast<>运算符 283 |
| 15.4.4RTTI的魅力与代价 285 |
| 第16章内存管理 287 |
| 16.1内存分配方式 287 |
| 16.2常见的内存错误及其对策 288 |
| 16.3指针参数是如何传递内存的 289 |
| 16.4free和delete把指针怎么啦 291 |
| 16.5动态内存会被自动释放吗 292 |
| 16.6杜绝“野指针” 292 |
| 16.7有了malloc/free为什么还要new/delete 293 |
| 16.8malloc/free的使用要点 295 |
| 16.9new有3种使用方式 296 |
| 16.9.1plainnew/delete 296 |
| 16.9.2nothrownew/delete 297 |
| 16.9.3placementnew/delete 297 |
| 16.10new/delete的使用要点 300 |
| 16.11内存耗尽怎么办 301 |
| 16.12用对象模拟指针 302 |
| 16.13泛型指针auto_ptr 305 |
| 16.14带有引用计数的智能指针 306 |
| 16.15智能指针作为容器元素 310 |
| 第17章学习和使用STL 323 |
| 17.1STL简介 323 |
| 17.2STL头文件的分布 324 |
| 17.2.1容器类 324 |
| 17.2.2泛型算法 325 |
| 17.2.3迭代器 325 |
| 17.2.4数学运算库 325 |
| 17.2.5通用工具 325 |
| 17.2.6其他头文件 326 |
| 17.3容器设计原理 326 |
| 17.3.1内存映像 326 |
| 17.3.2存储方式和访问方式 327 |
| 17.3.3顺序容器和关联式容器的比较 328 |
| 17.3.4如何遍历容器 331 |
| 17.3.5存储空间重分配问题 332 |
| 17.3.6什么样的对象才能作为STL容器的元素 333 |
| 17.4迭代器 334 |
| 17.4.1迭代器的本质 334 |
| 17.4.2迭代器失效及其危险性 338 |
| 17.5存储分配器 346 |
| 17.6适配器 347 |
| 17.7泛型算法 350 |
| 17.8一些特殊的容器 354 |
| 17.8.1string类 354 |
| 17.8.2bitset并非set 355 |
| 17.8.3节省存储空间的vector |
| 17.8.4空容器 358 |
| 17.9STL容器特征总结 360 |
| 17.10STL使用心得 362 |
| 附录AC++/C试题 365 |
| 附录BC++/C试题答案与 |
| 评分标准 369 |
| 附录C大学十年 375 |
| 附录D《大学十年》后记 393 |
| 附录E术语与缩写解释 395 |
| 参考文献... 397 |
