
随着嵌入式硬件技术的不断更新换代,对于嵌入式软件的开发与应用,仅单纯地使用汇编语言、C 语言已经很难满足大型项目的开发需求。目前C++已然成为嵌入式应用层开发的最流行编程语言之一,本书重点讲解实际项目中C++语言的156 个常用知识点,并分为156 个专题,以“加油站”的形式剖析项目的多种使用场景,归纳总结注意事项,出现问题的应对策略,并且着重指出了新入门的软件工程师比较模糊的问题及容易犯错的地方。此外,本书还设置了80 个项目技能实战训练的专题,以“训练场”的形式帮助读者提高实际的项目开发技能,使读者能够举一反三,并深刻理解,从而提高实际的开发技能。 本书结构清晰、内容由浅入深、循序渐进,可作为高校嵌入式系统程序设计的教材和嵌入式程序设计培训的实践教材及课程设计辅助读物,也可以作为广大嵌入式程序设计爱好者、在校大学生及单片机爱好者的自学用书。
序 1983 年,贝尔实验室的Bjarne Stroustrup 推出C++程序设计语言,经过三十多年的发展,C++语言在不断地成长与完善,充分证实了C++语言在软件产品开发中是经得起考验的。在众多的程序设计语言中,C++语言使用频率至今还处于前三名的地位,并且还有上升的趋势,比如在嵌入式领域,以单片机为代表的产品不再成为主流,目前嵌入式领域正处于互联网时代,整个行业的发展主流聚焦在物联网、云计算、机器人等领域,相关产品的开发完全使用汇编语言、C 语言等已经很难快速、高效地完成开发任务。使用C++语言完成产品大部分的开发任务已经成为嵌入式行业产品开发的一种趋势,因此从事软件产品开发工作,特别是嵌入式产品开发,掌握C++程序设计语言已经成为程序员的必备技能之一。 我在多年的教学和项目开发过程中,深深地体会到C++语言的重要性,尤其是C++标准 形成之后一些新特性,如泛型编程,在现代的大项目中使用十分广泛。虽然在普通高校的计算机相关专业的本科阶段都安排了C++语言课程,但是教学重点有些讲师把握不准,重点放在面向对象的概念和基础语法上,这样就造成有的学生对于实际项目的开发技能较为欠缺。每年我都会和前来参与校园招聘的公司负责人讨论人才培养的话题,有些公司软件负责人给我反馈这样的信息:公司存在不少程序员,甚至具备三年以上开发经验的程序员,写C++语言程序还是使用C 语言的思想,总是想方设法地使用C 语言而绕开C++语言的快捷用法,自己造轮子,对于模板和高级标准库使用一无所知。对于这样的问题,我曾经和软件一线的朋友(包括川大毕业多年的从业人员)深入、系统地讨论解决方案。周建设是我院软件工程专业的研究生,毕业后一直从事软件开发,至今已经有近十年的开发经验,他提出为这类人群编写一本辅助教程,帮助相关人员快速突破C++语言的技术壁垒。 市面上C++语言的书籍琳琅满目,中文、英文的数不胜数,还有必要推荐这本书吗?我 的回答是:有必要!因为这本书有其自身的特色与优势,作者根据他多年的实际项目开发经验,摒弃大而全的思想,对于大家容易理解和不太常用的冷知识点不做太多的关注。该书的重点是将项目中常用的知识点进行提取剖析,具体地讲,该书提取C++语言的156 个常用知识点,分为156 个专题,以“加油站”的形式剖析项目的多种使用场景,归纳总结注意事项以及出现问题的应对策略。此外,该书还设置了80 个项目技能实战训练的专题,以“训练场”的形式帮助读者提高实际的项目开发技能。我认真地阅读过156 个“加油站”和80 个“训练场”的内容,颇有收获,我愿意将本书推荐给每一位愿从事C++语言开发及对C++语言开发感兴趣的朋友,希望大家快速掌握C++程序设计语言,并在实际项目开发中学以致用。 四川大学软件学院 副院长 唐宁九 2015 年1 月1 日 前言 本书的编写目的 随着嵌入式硬件技术的不断更新换代,对于嵌入式软件的开发,单纯地使用汇编语言、C语言已经很难满足大型项目的开发需求。目前C++语言已经成为嵌入式应用层开发最流行的编程语言之一,本书不求讲到每一个C++语言的知识点,重点讲解实际项目中常用的一些知识点、开发技术,并且重点分析当前刚入行的软件工程师比较模糊的问题,分析容易犯错的地方,从而提高他们实际的开发技能。 本书的特色 本书是C++语言开发从入门到提高的教材,通过理论结合实际的方式,深入浅出地介绍其使用方法和技巧。目的在于让读者快速提高C++语言的开发技能。本书在编写过程中力求精益求精、浅显易懂、理论结合实际,通过实用性较强的实例展示C++语言相关知识点在实际产品开发中的应用。如果读者能够遵循相关的编程规范,掌握关键细节的使用技巧和常见错误的排查思路,再加上一定代码的编程训练,那么就能很快提高实际的开发技能。 本书对重要的知识点采用“加油站”的方式进行讲解,剖析相关技术的内部细节,让读者明白相关技术理论背后的内幕,并且对产品开发中的常用知识点在“训练场”中进行实战训练,在此过程中结合一些常犯的错误细节进行剖析,并及时做出点评与总结。 本书的主要组成部分 本书由11 章组成,分为三大部分。第一部分是第1 章至第2 章,介绍嵌入式开发背景知识,C++语言开发的基础知识,涉及C++语言的基本概念,常用开发技巧等。第二部分是第3章至第9 章,介绍C++语言面向对象编程的核心技术,这是本书的重点,涉及对类、对象等概念的剖析,重点讨论面向对象的三大特征(封装、继承与多态)在实际产品开发的应用。第三部分是第10 章至第11 章,介绍C++语言编程的高级知识:模板的用法,涉及自定义模板和标准模板库(STL)的使用。每章内容的概要如下所述。 第1 章 嵌入式开发初体验。本章介绍什么是嵌入式系统,嵌入式系统的体系结构, 主流嵌入式系统简介,为什么选择C++,C++编译环境介绍等。 第2 章 嵌入式C++开发必备知识。本章的知识点较多,概括起来主要包括C++程序结构、变量与常量、基本数据类型、C++基础语句、操作符与表达式、指针、数组、结构体、位段、联合、函数、引用以及数据类型强制转换的方法等内容。本章知识点的介绍侧重点在实际应用,而不是仅仅对纯概念的诠释,为让读者更直观地理解相关复杂的概念,本章结合了近百个实例进行辅助讲解。 第3 章 C++标准输入/输出。本章首先介绍命名空间和匿名空间的概念,使用方法与 技巧,然后介绍C++标准输入/输出,涉及C++流的特点、C++标准输入、C++标准输出以及输入/输出格式控制等内容。 第4 章 C++面向对象基础。本章主要介绍面向对象与面向过程的比较,初步理解C++ 嵌入式开发第1 站—突破C++的类与对象,构造函数与析构函数的使用,this 指针的分析,const 数据成员与函数成员的使用,static 数据成员与函数成员的使用,友元变量与友元类等内容。 第 5 章 深入讨论构造函数。本章主要介绍复制构造函数与复制赋值运算符函数的使 用,本章的学习目标是让读者掌握浅复制和深复制的使用场合,在实际产品开发中能够灵活应用。 第6 章 C++调试。本章主要介绍C++程序在开发过程中常用的调试方法与技巧。 第7 章 C++继承。本章主要介绍继承形式,三种继承方式的区别与使用场合,子类的 构造函数与析构函数,单继承子类的构造函数初始化列表,多继承子类的构造函数初始化列表以及虚继承等知识。 第8 章 编译时多态。本章主要介绍由于运算符重载而产生的编译时多态,选用典型 的实例介绍双目操作符重载、单目运算符重载、下标操作符重载、函数运算符重载和类型转换操作符重载的实现。 第9 章 运行时多态。本章主要内容包括多重继承对象的构造与析构顺序,父子对象之间赋值的限制规则,重载、覆盖、隐藏的区别,虚函数的定义,纯虚函数与抽象类,虚函数原理,对象指针访问虚函数成员的编译器限制,突破对象访问私有函数的限制,虚函数的默认参数绑定,typeid 关键字的使用,dynamic_cast 与多态以及C++异常机制等。 第10 章 自定义模板。本章涉及的内容主要包括函数模板定义、函数模板实例化、类 模板定义、类模板实例化、模板的全特化、模板的偏特化、类模板中赋值运算符重载函数的使用内幕等。 第11 章 标准模板库。本章主要介绍序列式容器、关联式容器、容器适配器、迭代器、算法、空间分配器以及仿函数的使用。
第1章 嵌入式开发初体验 1 1.1 什么是嵌入式系统 1 1.2 嵌入式系统的体系结构 2 1.3 主流嵌入式系统简介 3 1.4 为什么选择C++ 5 1.5 C++ 编译环境介绍 9 1.5.1 常用的C++编译环境介绍 9 1.5.2 g++和其他编译器编译的异同 11 第2章 嵌入式C++开发必备知识 16 2.1 C++程序结构 16 2.2 变量与常量 18 2.3 基本数据类型 19 2.4 C++基础语句 35 2.4.1 单分支语句 36 2.4.2 多分支语句 39 2.4.3 循环语句 44 2.5 操作符与表达式 54 2.6 指针 71 2.6.1 认识指针 71 2.6.2 动态内存的申请与释放(new/free) 79 2.6.3 指针的使用 82 2.7 数组 86 2.7.1 认识数组 87 2.7.2 普通数组的使用 93 2.7.3 高级数组的使用 101 2.8 结构体 111 2.8.1 结构体的基础知识 111 2.8.2 结构体在实战中的使用 116 2.9 位段 123 2.10 联合 124 2.11 函数 129 2.11.1 函数的基础知识 129 2.11.2 函数高级应用 131 2.12 浅谈引用 148 2.13 数据类型强制转换 152 第3章 C++标准输入/输出 157 3.1 命名空间 157 3.1.1 理解命名空间 157 3.1.2 使用自定义命名空间 161 3.2 C++标准输入/输出 167 3.2.1 C++流介绍 167 3.2.2 输入/输出格式控制 170 第4章 C++面向对象基础 183 4.1 面向对象与面向过程的比较 184 4.2 初步理解C++的类 188 4.3 this指针的分析 197 4.4 构造函数与析构函数 203 4.5 const 成员 214 4.6 static成员 223 4.7 友元 238 第5章 深入讨论构造函数 242 5.1 复制构造函数 242 5.2 复制赋值运算符函数 249 5.3 临时对象的构造函数 255 第6章 C++调试 259 6.1 C++错误常用的追踪方式 259 6.1.1 C++编程常见的错误类型 259 6.1.2 常用调试方法 261 6.2 断点单步追踪法 262 6.2.1 准备工作 262 6.2.2 常用调试操作 262 6.3 内核状态追踪法 276 第7章 C++继承 279 7.1 继承形式 279 7.2 三种继承方式 284 7.3 继承的构造函数与析构函数 296 7.4 虚继承 307 第8章 编译时多态 312 8.1 运算符重载初步 312 8.2 双目操作符重载 314 8.3 单目运算符重载 331 8.4 下标操作符重载 344 8.5 函数运算符重载 355 8.6 类型转换操作符重载 362 第9章 运行时多态 369 9.1 多重继承对象间赋值回顾 369 9.2 认识虚函数 376 9.3 虚函数原理 380 9.4 多态与编译器的“战争” 390 9.5 运行时多态的两个辅助工具 395 9.6 C++异常机制 401 第10章 自定义模板 407 10.1 模板的定义与实例化 407 10.2 模板的特殊处理 418 第11章 标准模板库 434 11.1 容器 435 11.1.1 序列式容器 437 11.1.2 关联式容器 448 11.1.3 容器适配器 468 11.2 迭代器 474 11.3 算法 477 11.4 空间分配器 478 11.5 仿函数 481