本书是一本集C++语言高级特性和面向对象思想于一身的中级技术指南。在涵盖了C++语言的主要特点(封装、继承、多态)之余,从软件建模的视角出发,引入了针对抽象编程、聚合优先于继承、低耦合、高内聚等面向对象思想的讲述。此外,对困惑程序员已久的程序依赖问题做了深入分析; 给出了异步消息通信的原理及实现; 引入了架构分析,对循环依赖和MVC模式的原理实现及缺陷改良也做了深入论述。本书有别于一般介绍C++语言的书籍,涉及了一些底层原理和编译知识的挖掘理解; 不同于纯粹介绍软件模式等面向对象设计方面的书籍,在内容设计上注重由浅入深,实例指导; 结合面向对象思想,对各种软件基础模式的原理思想和实现也有介绍。
本书可作为高等院校相关专业高年级本科生、研究生的教材,也可作为软件开发领域工程师的参考书。
为什么要写这样一本C++技术书籍
本书最开始的想法很简单,即为定制班的学生服务。本书第一作者在IT行业从业近十年,是软通动力信息技术(集团)公司的高级系统分析师,同时也是一名高校教师。2010年5月软通动力公司与笔者所在高校签订了C++软件工程师定制班培养协议,从那时起,就有了系列教材出版计划,其中《面向对象UML系统分析建模》于2013年9月已由清华大学出版社出版。
从实际教学和工程指导所需来看,为何不能够集中课时将关注点集中在C++的中高级特性上,少言甚至滤去有关输入输出、基本语言特性部分; 为何不能将两类多态的原理讲透彻,让学生理解多态中蕴含的软件复用的发展; 为何不能结合软件设计模式让学生理解拥抱变化的内涵; 为何不能结合面向对象思想精髓让学生在初始编程时就养成测试驱动和MVC分层、针对抽象不针对具象的基本素养?每一个IT人,都有着技术的狂热和理想,自己不例外更希望能适当总结一些单纯、适用的东西给这些年轻的IT从业者,希望他们能在商业项目忙碌之余,手头上能有一本给予适当启发的参考书。
自C++语言诞生以来,面向对象程序设计成为主流,但C++语言学习的高难度使得它在程序员市场在21世纪初面临着以Java语言为代表的第二代面向对象程序设计语言的强烈竞争。自Visual Basic、Delphi等客户前端开发工具出现后,C/C++语言逐步退出桌面端开发工具市场,而退守深植根于嵌入式和后台交换控制领域。1998年Java语言诞生,以其前后台通吃地全面性席卷全球,并迅速迎来Web开发时代,软件迎来C/S模式向B/S模式的深刻变革。一时间,在桌面开发工具市场上,Java的AWT/SWING所向披靡,摧枯拉朽般消灭了Visual Basic、Delphi、PowerBuilder等开发工具; 在Web开发工具市场,J2EE的JSP+Servlet的Model2模型迅速成为市场主流压倒ASP框架。更主要的是,Java语言一改程序员严格的内存分配、初始化、释放自律负责的态度,程序员不再需要关注内存细节,极大降低了编程难度; Java首创虚拟机即时编译,使得字节码的编译结果得以在不同虚拟机平台上再次动态编译执行成为可能,从根本上解决了应用程序的扩OS平台移植难题——此举从根本上将程序员繁重的移植任务交给了Java语言本身,即由JDK的拥有者负责不同版本虚拟机的支持解释。但不论Java如何强势,在TIOBE编程语言排行榜独占鳌头近十年,但在企业后台交换市场和一些严格强调安全性、并发性、效率性能的行业市场,C/C++以其专业性地位牢不可破。纵观20世纪80年代以来的编程语言市场,C/C++语言该体系遥遥领先于其他编程语言,即便Java语言最强大时期也从未占据20%以上份额; 最近七八年来,随着移动互联和手游的兴起,C++以其杰出的底层控制和语言效率王者归来,与C语言、Java语言一起牢牢占据着TIOBE编程语言排行榜的三甲。
在程序员初入行市场薪资水平上,C/C++程序员工资一般高于Java程序员,近年来对C/C++程序员的追逐饥渴热度直线上升,且与Java程序员工资差距呈现不断扩大趋势。作为企业任职的高级系统分析师和高校教师双重身份的我们,不禁疑惑,究竟是怎么了,那些20世纪80~90年代大学生们学习C/C++的狂热都到哪里去了?
问题还是出在Java身上,它把程序员惯坏了: 它让身为程序员应具有的严格、规范和全局性思维不再。越来越多的人认识到,学生必须掌握基础,必须牢固地理解内存和OS机制,而不能什么都交给虚拟机。数据结构、算法课程,更应植根于C/C++本身特性,而并非各种STL、JDK的教学上。
另外,Java语言和J2EE框架的流行又极大地普及了设计模式和软件建模的应用。那么反过来,是否可以将这种模式建构系统的观点应用在C++语言中的教学中,让从业者、初学者能从浩如烟海的C++知识点中汲取到那最宝贵的百分之十面向对象思想?笔者教学和实施项目之余,常常想着这样的念头如何付诸实施。2013年9月,经过3年认真删减留下的精简版的《面向对象UML系统分析建模》终于出版了,该书有别于传统讲述UML和RUP模型的工具书,反而更似一本将建模与设计模式结合的技术专著,得到众多褒扬之余,也下定决心再写一本C++与建模结合的书,让学习C++语言的人能够感受到面向对象之美,体验设计模式之灵活神奇。
书的主要内容有哪些
全书共8章,第1和第2章扼要回顾C语言并介绍C++语言的主要特点(封装、继承、多态),对功能分解和逐步分层求精做了深入阐述,对软件复用做了归纳,对容易混淆的变量/函数声明、变量/函数定义做了清晰的区分,对多文件工程常见的头文件重复包含问题给出了原理上的分析和解决方法; 第3章将指针和引用一起做了深入的分析比对; 第4章对类和对象做了全面的阐述(类结构、类的分析识别过程、对象初始化、析构); 第5章全面深入地阐述了两类多态原理,对函数间的重载、覆盖、隐藏关系做了精确深入的剖析,并引入了针对抽象编程这一关键面向对象思想; 第6章对类间的4种关系(继承、聚合、关联、依赖)做了清晰描述,结合实例引入了聚合优先于继承以及低耦合高内聚等面向对象思想的讲述,对困惑C++程序员的程序依赖问题做了深入挖掘分析,最后详尽阐述了消息通信机制,给出了异步消息通信的原理及实现; 第7章对内存泄漏、运算符重载、友元、抽象类以及virtual“三虚”做了全面细致的分析阐述; 第8章对循环依赖问题、架构分析以及MVC原理实现与缺陷改良做了深入论述,最后引入了一个综合应用了针对抽象编程、依赖倒置、聚合优先于继承等面向对象思想的实例。
谁需要本书
学习和了解了一些C++语言特性,但却始终无法真正迈进面向对象大门的程序员可能需要本书; 绝大多数在面向对象领域里刻苦攻读、努力实践、却迟迟不能看到美好回报的程序员可能需要本书; 一些准备学习设计模式、UML软件建模、软件重构和软件体系结构知识的中高级软件工程师可能需要本书。
分工与答谢
笔者都是从业IT多年的软件工程师、项目经理或高校教师。孙宝林、崔洪芳和曾长军负责编写第1章; 桂超、胡汉武和李祥负责编写第2章; 关培超、刘坤和邓沌华负责编写第3章; 包琼、陈婕和尤川川负责编写第7章; 刘鹏远和温珏负责其余章节的编写及全书统稿。
在本书编写过程中,要特别感谢戴志锋和曾宇容等人,是他们在长期教学实践中给予真知灼见的指导。要向王虹致以崇高敬意,本书体例编写、文字组织得到了他的精心指导; 要向薛吉宝、蒋国银等领导致谢,是他们的坚强领导和有力组织使得该书从签订合同到付梓出版仅耗时半年多时间; 要向软通动力信息技术(集团)的陈友华、李江波、苑永超、汪亚军、袁盐成等同事们致意,感谢他们的宝贵意见和建议,使该书更能适应IT企业员工的所急所想,更具有实用性; 最后,还要感谢华中科技大学的陈传波、云南大学的李彤,以及南湖地区计算机联盟、湖北省高校计算机学会联盟等单位的支持,没有他们的不吝赐教与帮助,本书难以如此顺利的出版。
第1章绪论
1.1结构化程序设计的特点
1.1.1水平功能分解
1.1.2垂直逐步分层求精
1.2C++的特点
1.2.1全面兼容C
1.2.2强类型检查
1.2.3封装
1.2.4继承
1.2.5软件复用
1.2.6多态
第2章语言基本要素
2.1基本编程语句
2.2运算与表达式
2.3声明与定义
2.3.1变量定义
2.3.2变量声明
2.3.3函数定义
2.3.4函数声明
2.3.5类声明与定义
第3章指针与引用
3.1值传递
3.1.1赋值兼容性检查
3.1.2值传递时机
3.2指针
3.2.1定义
3.2.2值
3.2.3型与值
3.2.4值传递
3.3多重指针
3.4void*指针
3.4.1定义
3.4.2用途
3.5函数指针
3.6const修饰符
3.7数组
3.7.1一维数组
3.7.2多维数组
3.7.3数组指针
3.7.4字符串常量与字符数组
3.7.5越界检查
3.8引用
3.8.1定义
3.8.2引用传递
3.8.3引用的意义
第4章类与对象
4.1类与结构体
4.2类的分析识别过程
4.3访问控制符
4.3.1类内/外部与授权访问
4.3.2public访问属性
4.3.3private访问属性
4.3.4protected访问属性
4.4静态变量
4.4.1静态、全局、局部
4.4.2类的静态成员
4.5初始化与构造
4.5.1变量声明、定义与初始化
4.5.2单类构造
4.5.3继承构造
4.5.4成员初始化表
4.6析构
4.6.1内存区域
4.6.2生命期与作用域
4.6.3内存分配/销毁
4.6.4单类析构
4.6.5继承结构析构
4.6.6组合析构
4.6.7虚析构
第5章多态
5.1静态多态
5.1.1重载
5.1.2模板
5.2动态多态
5.3函数间关系
5.3.1重载
5.3.2覆盖
5.3.3隐藏
5.4针对抽象编程
第6章类间关系
6.1继承关系
6.1.1ISA的软件复用含义
6.1.2继承改写子类成员访问控制符
6.1.3继承带来的麻烦与问题
6.1.4开闭原则
6.2使用关系
6.2.1关联
6.2.2聚集
6.2.3依赖
6.2.4聚合优先于继承
6.3程序依赖问题
6.3.1向前引用
6.3.2弱类型依赖
6.3.3双向依赖
6.4低耦合与高内聚
6.4.1低耦合模式
6.4.2高内聚模式
6.5消息通信机制
6.5.1同异步消息范畴
6.5.2多进程间异步消息通信机制
6.5.3单宿主机单进程内异步消息通信应用范畴
第7章杂项
7.1内存泄漏
7.1.1第一类内存泄漏
7.1.2第二类内存泄漏
7.2运算符重载
7.2.1普通运算符重载
7.2.2成员运算符重载
7.2.3转换构造与运算符重载
7.3友元
7.3.1友元函数
7.3.2友元类
7.4抽象类与纯抽象类
7.4.1抽象类
7.4.2纯抽象类
7.5virtual“三虚”
第8章高级面向对象思想
8.1循环依赖问题
8.2架构分析
8.3MVC模式
8.3.1模式设计目的
8.3.2模式基本结构
8.3.3模式的不足
8.4应需而变实例
参考文献