本书立足编程实践,以Linux或者Windows为开发平台,从初学者的角度出发,以面向对象程序设计思想为主线,结合实际项目的开发需求,将隐藏在面向对象背后的关于C++抽象、封装、继承、多态等机制和知识娓娓道来,用通俗易懂的语言展开讲解,不仅让读者知其然,更要让读者知其所以然,最终让这些知识再反作用于编程实践,帮助读者写出高质量的C++代码。全书涉及面向对象的嵌入式软件开发的方方面面,具体说来,主要讨论包括面向对象语言的特点、MySQL数据库的应用、QT基础知识入门及项目开发过程等多个方面的话题。
周颖颖,女,毕业于东南大学。多年从事软件技术的教学工作,获得多个省级教学奖项;以第一作者公开发表核心论文1篇,各类教科研论文多篇;主持和参与多项省级和校级教学改革项目、多项科研课题;指导多项省级大学生创新项目,指导学生参加各种省级技能大赛并获奖。
第1章 面向对象概述 (1)
1.1 C++概述 (1)
1.1.1 C++的发展 (1)
1.1.2 为什么要学习C++ (2)
1.2 面向过程和面向对象 (2)
第2章 C到C++的扩展 (5)
2.1 命名空间 (5)
2.1.1 什么是命名空间 (5)
2.1.2 命名空间的使用 (6)
2.1.3 命名空间完整示例代码 (7)
2.1.4 C++标准库和std命名空间 (8)
2.2 小程序“Hello World” (10)
2.2.1 输出“Hello World” (10)
2.2.2 C++的输入和输出(cin和cout) (10)
2.3 变量定义的位置 (11)
2.4 register关键字的变化 (12)
2.5 struct的加强 (13)
2.6 三目运算符的加强 (14)
2.6.1 C与C++中三目运算符的不同 (14)
2.6.2 如何在C语言中实现C++的特性 (14)
2.7 bool类型 (15)
2.8 C/C++中的const (16)
2.8.1 C中的const (16)
2.8.2 C++中的const (17)
2.8.3 const与define (18)
2.9 C++中的引用 (20)
2.9.1 引用的概念与基本使用 (20)
2.9.2 引用作为函数参数 (21)
2.9.3 引用作为函数返回值 (23)
2.9.4 指针引用 (24)
2.9.5 常引用 (26)
2.9.6 引用的本质 (27)
2.10 C++内联函数 (28)
2.10.1 内联函数的概念和使用 (28)
2.10.2 内联函数的特点和使用限制 (29)
2.11 C++函数的默认参数 (29)
2.12 C++函数的占位参数 (30)
2.13 C++中的函数重载 (32)
2.13.1 函数重载的概念 (32)
2.13.2 C++函数重载与函数指针 (34)
2.13.3 函数重载的二义性 (35)
2.13.4 函数重载与const形参 (35)
2.14 C++的动态内存分配 (37)
2.14.1 new与delete的基本用法 (37)
2.14.2 拓展:多维数组的动态创建与释放 (38)
第3章 类和对象 (40)
3.1 面向对象编程介绍 (40)
3.1.1 什么是面向对象 (40)
3.1.2 面向对象的优点 (40)
3.1.3 面向对象的特点 (41)
3.1.4 总结 (42)
3.2 类和对象 (43)
3.2.1 类和对象的概念 (43)
3.2.2 类的访问控制 (45)
3.2.3 类的使用案例 (48)
3.2.4 面向对象编程实例 (49)
3.3 对象的构造和析构 (52)
3.3.1 构造函数 (52)
3.3.2 构造函数的重载和调用 (53)
3.3.3 拷贝构造函数 (56)
3.3.4 默认构造函数 (58)
3.3.5 析构函数 (59)
3.3.6 构造函数的参数初始化列表 (60)
3.3.7 对象的动态创建和释放 (63)
3.4 浅拷贝和深拷贝 (64)
3.4.1 浅拷贝问题分析 (64)
3.4.2 深拷贝 (66)
3.5 静态成员变量和静态成员函数 (67)
3.5.1 静态成员变量 (67)
3.5.2 静态成员函数 (70)
3.6 C++对象的内存模型 (72)
3.6.1 编译器对属性和方法的处理机制 (72)
3.6.2 this指针 (74)
3.6.3 const修饰成员函数 (75)
3.7 友元函数和友元类 (76)
3.7.1 友元函数 (77)
3.7.2 友元类 (80)
3.7.3 友元函数的几点说明 (82)
第4章 运算符重载 (83)
4.1 概念 (83)
4.1.1 什么是运算符重载 (83)
4.1.2 运算符重载的使用 (84)
4.2 运算符重载的规则 (89)
4.3 常用的运算符重载 (91)
4.3.1 前置++与后置++的重载 (91)
4.3.2 左移<<与右移>>操作符的重载 (93)
4.3.3 成员函数与友元函数重载的选择 (97)
4.4 赋值运算符=的重载 (97)
4.5 数组下标运算符[]的重载 (100)
4.6 函数调用运算符()的重载 (103)
4.7 new和delete运算符的重载 (103)
第5章 继承与派生 (107)
5.1 继承的概念及语法 (107)
5.1.1 类之间的关系 (108)
5.1.2 继承关系 (108)
5.1.3 继承的使用 (108)
5.2 派生类的访问控制 (110)
5.3 继承中的对象内存模型 (114)
5.4 派生类的构造函数和析构函数 (115)
5.4.1 派生类的构造函数 (115)
5.4.2 派生类的析构函数 (117)
5.4.3 继承与组合混搭情况下构造和析构调用原则 (119)
5.5 继承时的名字遮蔽 (121)
5.6 继承中的static关键字 (123)
5.7 继承中的类型兼容性原则 (125)
5.8 多继承 (128)
5.8.1 多继承的概念 (128)
5.8.2 多继承中的构造与析构 (129)
5.8.3 多继承导致的二义性问题 (131)
5.8.4 多继承时的对象内存模型 (132)
5.9 虚继承 (135)
5.9.1 虚继承与虚基类 (135)
5.9.2 虚继承时的构造函数 (139)
5.9.3 虚继承时的对象内存模型 (141)
第6章 多态 (143)
6.1 多态的概念与使用 (143)
6.2 虚函数详解 (147)
6.3 虚析构函数 (149)
6.4 多态的实现机制 (153)
6.4.1 多态原理 (153)
6.4.2 构造函数中调用虚函数能否实现多态 (155)
6.4.3 父类指针操作子类数组 (157)
6.5 多继承下的多态 (159)
6.6 虚继承下的多态 (161)
6.7 纯虚函数和抽象类 (162)
6.8 typeid运算符 (165)
6.9 静态绑定和动态绑定 (168)
第7章 模板 (171)
7.1 函数模板 (171)
7.1.1 函数模板语法 (171)
7.1.2 函数模板和函数重载 (176)
7.1.3 函数模板机制 (178)
7.2 类模板 (179)
7.2.1 单个类的类模板语法 (179)
7.2.2 继承中的类模板语法 (182)
7.2.3 类模板的使用 (184)
7.3 类模板中的关键字static (191)
第8章 异常 (193)
8.1 什么是异常 (193)
8.2 异常的语法 (194)
8.3 异常类型以及多级catch (195)
8.4 throw详解 (197)
8.5 标准库异常 (199)
第9章 输入/输出流 (201)
9.1 输入/输出流介绍 (201)
9.1.1 输入/输出流的理解 (201)
9.1.2 流的理解 (202)
9.1.3 为什么要引用输入/输出流 (203)
9.1.4 流的缓冲区 (204)
9.2 标准输入/输出流 (205)
9.2.1 标准输入/输出流对象 (205)
9.2.2 输出流的使用 (205)
9.2.3 输入流的使用 (206)
9.2.4 输入/输出格式化 (211)
9.3 文件输入/输出流 (215)
9.3.1 文件的打开与关闭 (215)
9.3.2 文件的读写 (217)
9.4 字符串流的读写 (219)
第10章 标准模板库STL (222)
10.1 STL概述 (222)
10.1.1 STL基本概念 (222)
10.1.2 容器 (223)
10.1.3 算法 (224)
10.1.4 迭代器 (225)
10.1.5 C++标准库 (225)
10.2 常用容器 (225)
10.2.1 string (225)
10.2.2 vector容器 (232)
10.2.3 deque容器 (237)
10.2.4 list容器 (240)
10.2.5 map容器 (243)
10.2.6 set容器 (247)
10.3 常用算法 (247)
10.3.1 算法概述 (247)
10.3.2 算法分类 (247)
10.3.3 算法中函数对象和谓词 (250)
10.3.4 预定义函数对象和谓词 (255)
10.3.5 函数适配器 (256)
第11章 C++11/14新标准 (259)
11.1 概述 (259)
11.2 实用性加强 (260)
11.2.1 新类型 (260)
11.2.2 统一初始化 (260)
11.2.3 nullptr与constexpr (261)
11.2.4 类型推导 (264)
11.2.5 基于范围的for循环 (266)
11.2.6 强类型枚举 (266)
11.2.7 智能指针 (268)
11.2.8 右值引用:移动语义和完美转发 (275)
11.3 类的加强 (277)
11.3.1 特殊成员函数 (277)
11.3.2 委托构造 (278)
11.3.3 继承构造 (278)
11.3.4 虚方法管理:override和final (278)
11.3.5 显示禁用默认函数 (279)
11.4 对模板的加强 (279)
11.4.1 外部模板 (279)
11.4.2 尖括号<> (280)
11.4.3 模板别名using= (280)
11.4.4 默认模板参数 (281)
11.4.5 可变参数模板 (281)
11.5 lambda函数 (282)
11.6 对标准库的加强 (283)
11.6.1 新增容器 (283)
11.6.2 包装器 (284)
11.6.3 正则表达式 (285)
11.6.4 并发编程 (286)
第12章 常用设计模式 (289)
12.1 概述 (289)
12.2 设计模式的基本原则 (289)
12.3 常用设计模式 (290)
12.3.1 单例模式 (290)
12.3.2 简单工厂模式 (298)
12.3.3 工厂方法模式 (300)
12.3.4 抽象工厂模式 (302)
12.3.5 建造者模式 (305)
12.3.6 代理模式 (308)
12.3.7 装饰模式 (310)
12.3.8 策略模式 (313)
12.3.9 观察者模式 (315)
第13章 数据库基础 (320)
13.1 数据库简介 (320)
13.1.1 MySQL简介 (320)
13.1.2 关系型数据库 (321)
13.2 MySQL安装 (322)
13.2.1 MySQL安装测试 (323)
13.2.2 MySQL服务开启与使用 (324)
13.3 MySQL管理 (324)
13.3.1 MySQL用户设置 (324)
13.3.2 管理MySQL的命令 (327)
13.4 MySQL数据类型 (327)
13.4.1 整型 (327)
13.4.2 浮点型 (328)
13.4.3 定点数 (329)
13.4.4 字符串 (329)
13.4.5 二进制数据 (330)
13.4.6 日期和时间类型 (330)
13.4.7 数据类型的属性 (331)
13.5 MySQL使用 (332)
13.5.1 登录MySQL (332)
13.5.2 建库建表 (333)
13.5.3 数据增删改查 (334)
13.5.4 删除整个数据库 (336)
13.6 MySQL接口使用 (336)
13.6.1 MySQL中文完全参考手册 (336)
13.6.2 获取错误信息 (337)
13.6.3 连接服务器 (337)
13.6.4 数据查询 (339)
13.6.5 MySQL的事务处理 (342)
13.6.6 索引 (343)
13.7 MySQL案例 (344)
第14章 Qt入门 (349)
14.1 Qt简介 (349)
14.1.1 Qt Creator的下载与安装 (349)
14.1.2 Qt Creator环境介绍 (350)
14.2 Hello World (352)
14.2.1 编写Hello World程序 (352)
14.2.2 添加一个按钮 (356)
14.2.3 Qt的信号和槽机制 (356)
14.2.4 程序的发布和运行 (357)
14.3 窗口部件 (358)
14.3.1 基础窗口部件QWidget (359)
14.3.2 对话框Qdialog (360)
14.3.3 其他窗口部件 (363)
14.4 布局管理 (365)
14.4.1 布局管理系统 (365)
14.4.2 设置伙伴 (367)
14.4.3 设置Tab键顺序 (367)
14.5 常用控件介绍 (368)
14.5.1 常用控件需要加载的头文件 (368)
14.5.2 控件变量定义 (369)
14.5.3 控件初始化 (369)
14.5.4 在垂直布局中加载控件 (369)
14.5.5 常用控件使用 (370)
14.6 文件、目录和输入/输出 (372)
14.6.1 文件和目录 (372)
14.6.2 文本流和数据流(QDataStream和QtextStream) (374)
14.7 Qt和数据库 (375)
14.7.1 连接到数据库 (375)
14.7.2 执行SQL语句 (376)
14.8 Qt网络编程 (376)
14.8.1 Qt和TCP (377)
14.8.2 Qt和UDP (378)
参考文献 (380)