简介
《完美C++(第5版)》为读者提供了一个学习、理解和掌握C++编程语言的全面视图,覆盖面广、实用性强。书中介绍了C++的基本数据类型,如字符串、数组、指针、结构体、类等,同时也详细描述了面向对象编程语言的特性:封装、继承和多态,以及这些特性在C++语言中的具体使用方式。本书的后面章节还重点介绍了模板、链式数据结构、标准模板库以及异常处理等C++语言的进阶编程知识。这些知识在从事具体编程工作时会经常使用到。 《完美C++(第5版)》对C++的一些重点知识,辅以实例进行了重点讲解,特别是对一些易混淆、易犯错的知识点,专门以“陷阱”的组织方式进行深入分析和讨论,帮助读者更好地理解和掌握。《完美C++(第5版)》中各章均含有大量例子及完整的代码段和分析,帮助读者强化对关键概念的理解,以及对主题的掌握。各章还配有丰富的自测习题以及答案,帮助读者进一步提升对C++知识的理解以及实际动手编程能力。 原书由知名学者所著,历经多个版本,根据C++技术的发展,内容不断完善、丰富,体系完整、实践性强。 《完美C++(第5版)》可以作为高等院校学习编程基本知识以及C++编程语言课程的教材,也可以作为有C++编程经验者的参考书。
目录
1.1 C++简介
C++语言的起源
C++与面向对象编程
C++的特点
C++术语
C++程序示例
1.2 变量、表达式及赋值语句
标识符
变量
赋值语句
string类简介
陷阱:未初始化变量
提示:采用有意义的变量名
更多赋值语句
赋值兼容性
字面值
转义序列
命名常量
算数运算符和表达式
整数和浮点数除法
陷阱:全整数除法
类型转换
自增和自减运算符
陷阱:求值顺序
1.3 控制台输入/输出
使用cout输出
换行符
提示:以\n或endl结束程序
格式化浮点数
用cerr输出
用cin输入
提示:输入/输出中的换行
1.4 编程风格
注释
1.5 库与命名空间
库与include命令
命名空间
陷阱:库名的问题
第2章 流程控制
2.1 布尔表达式
创建布尔表达式
陷阱:不等式连写
布尔表达式求值
优先级规则
陷阱:整数值用作布尔值
2.2 分支机制
if-else语句
复合语句
陷阱:用=代替==
省略else
嵌套语句
多分支if-else语句
switch语句
陷阱:遗漏switch语句中的break
提示:在菜单中使用switch语句
枚举类型
条件运算符
2.3 循环
while和do-while循环
再谈自增和自减运算符
逗号运算符
for语句
提示:重复N次的循环
陷阱:for语句中额外的分号
陷阱:无限循环
break与continue语句
嵌套循环
2.4 文件输入简介
通过ifstream读取文本文件内容
第3章 函数基础
3.1 预定义函数
带有返回值的预定义函数
预定义的void函数
随机数生成器
3.2 自定义函数
定义带有返回值的函数
函数声明的另一种形式
陷阱:参数顺序的错误
调用函数的函数
示例:一个四舍五入的函数
返回布尔值的函数
定义void函数
void函数中的return语句
前提条件和运行结果
main函数
递归函数
3.3 作用域规则
局部变量
过程抽象
全局常量和全局变量
语句块
嵌套作用域
提示:在分支和循环语句中使用函数调用
for循环体中的变量声明
第4章 函数与重载
4.1 参数
传值参数
初识引用参数
引用传递调用机制详解
常量引用参数
示例:函数swapValues
提示:一种操作,而不是代码
混合参数列表
提示:使用何种参数
陷阱:无意的局部变量
提示:选择形参的名字
示例:买比萨
4.2 重载与默认实参
重载简介
陷阱:自动类型转换与重载
重载解析的规则
示例:改写“买比萨程序”
默认参数
4.3 函数的测试和调试
assert宏
占位程序和驱动程序
第5章 数组
5.1 数组简介
数组的声明和引用
提示:对数组使用for循环
陷阱:数组的索引始终是从0开始的
提示:使用已定义的常量作为数组的大小
内存中的数组
陷阱:数组越界
数组的初始化
5.2 函数中的数组
索引变量作为函数实参
整个数组作为函数实参
const修饰符
陷阱:const参数的不一致使用
返回数组的函数
示例:生产图表
5.3 用数组编程
部分填充的数组
提示:不要吝啬形参的使用
示例:查询数组
示例:给数组排序
5.4 多维数组
多维数组基础
多维数组参数
示例:使用二维数组的记分程序
第6章 结构体和类
6.1 结构体
结构体类型
陷阱:漏掉结构体定义末尾的分号
结构体作为函数参数
提示:使用多重结构体
结构体的初始化
6.2 类
定义类和成员函数
封装
公有成员和私有成员
取值和赋值函数
提示:接口和实现的分离
提示:封装的测试
结构体与类
提示:对象思考
第7章 构造函数及其他工具
7.1 构造函数
构造函数的定义
陷阱:无参构造函数
构造函数的显式调用
提示:总是为类定义一个默认构造函数
示例:BankAccount类
类类型成员变量
7.2 其他工具
const修饰符
陷阱:const的不一致用法
内联函数
静态成员
嵌套类和局部类定义
7.3 向量——标准模板库预览
向量基础
陷阱:方括号的索引超过向量的大小
提示:向量的赋值
效率问题
第8章 运算符重载、友元和引用
8.1 基本运算符的重载
重载基础
提示:构造函数可以返回一个对象
返回常量类型
一元运算符的重载
作为成员函数的运算符重载
提示:类可以访问其所有对象
重载函数调用符( )
陷阱:重载 &&、||及逗号运算符
8.2 友元函数与自动类型转换
构造函数的自动类型转换
陷阱:成员运算符和自动类型转换
友元函数
友元类
陷阱:不支持友元的编译器
8.3 引用和其他运算符重载
引用
提示:返回类的成员变量
重载“>>”和“<<”
提示:应使用什么样的返回值类型
赋值运算符
重载自增和自减运算符
重载数组运算符[ ]
基于左值和右值的重载
第9章 字符串
9.1 字符串类型数组
C字符串值和C字符串变量
陷阱:对C字符串使用 “=” 和 “==”
中的其他函数
示例: 命令行参数
C字符串的输入/输出
9.2 字符操作工具
字符的输入/输出
成员函数get和put
示例:使用换行函数检查输入
陷阱:输入时没有处理‘\n’
成员函数putback、peek和ignore
字符操作函数
陷阱:函数toupper和tolower返回int型数值
9.3 标准string类
标准string类简介
string类的输入和输出
提示:getline函数的其他版本
陷阱:对cin同时使用>>和getline
使用string类处理字符串
示例: 回文检测
string类对象和C字符串的转换
第10章 指针和动态数组
10.1 指针
指针变量
内存管理基础
陷阱:悬空指针
动态变量和自动变量
提示:定义指针类型
陷阱:指针用作传值参数
指针的应用
10.2 动态数组
数组变量和指针变量
创建并使用动态数组
示例:一个返回数组的函数
指针运算
多维动态数组
10.3 类、指针和动态数组
运算符->
this指针
重载赋值运算符
示例:部分填充数组的类
析构函数
拷贝构造函数
第11章 分散编译和命名空间
11.1 分散编译
封装回顾
头文件和实现文件
示例:DigitalTime类
提示:可重用的组件
使用#ifndef
提示:定义其他库
11.2 命名空间
命名空间和using指令
创建一个命名空间
using声明
限定名称
提示:为命名空间取名
示例:一个定义在命名空间中的类
无名称的命名空间
陷阱:混淆全局命名空间和无名称命名空间
提示:用无名称命名空间代替static修饰符
提示:隐藏帮助函数
嵌套命名空间
提示:应该如何指明使用的命名空间
第12章 流和文件I/O操作
12.1 I/O流
文件I/O
陷阱:流变量的使用限制
向文件追加输出内容
提示: 打开文件的另一种方法
提示:检查一个文件是否已被成功打开
字符I/O
文件结束检查
12.2 I/O流工具
使用文件名输入
使用流函数进行格式化输出
控制符
保存设置的标记
更多的输出流成员函数
示例:整理文件格式
示例:编辑文本文件
12.3 流的继承层次:继承概述
流之间的继承
示例:另一版本的newLine函数
使用类stringstream解析字符串
12.4 随机文件存取
第13章 递归
13.1 递归void函数
示例:竖直排列的数字
跟踪一个递归调用
深入理解递归
陷阱:无限递归
递归调用中的栈
陷阱:栈溢出
递归与迭代的比较
13.2 有返回值的递归函数
有返回值的递归函数的一般形式
示例:另一个幂函数
交叉递归
13.3 按递归方式思考问题
递归设计技巧
二分查找
编码
检查递归是否正确
效率
第14章 继承
14.1 继承基础
派生类
派生类的构造函数
陷阱:使用基类的私有成员变量
陷阱:私有成员函数是无法被有效继承的
protected限定符
成员函数的重定义
重定义与重载
访问被重定义过的基类函数
不可被继承的函数
14.2 利用继承编程
派生类中的赋值运算符和拷贝构造函数
派生类的析构函数
示例:可备份的部分填充的数组
陷阱:赋值运算符两边是同一个对象
示例:PFArrayDBak的另一种实现
提示:一个类可以访问本类所有对象的私有成员
提示:“是一个”和“有一个”
保护继承和私有继承
多继承
第15章 多态与虚函数
15.1 虚函数基础
延迟绑定
C++中的虚函数
提示:virtual属性会被继承
提示:什么时候应该使用虚函数
陷阱:没有对虚成员函数进行定义
抽象类与纯虚函数
示例:抽象类
15.2 指针和虚函数
虚函数与扩展类型兼容性
陷阱:切片问题
提示:使析构函数成为虚函数
向下类型转换和向上类型转换
C++如何实现虚函数
第16章 模板
16.1 函数模板
函数模板语法
陷阱:编译器的复杂性
提示:如何定义模板
示例:一个通用的排序函数
陷阱:使用模板时误用了不正确的数据类型
16.2 类模板
类模板语法
示例:一个数组模板类
模板中的vector和 basic_string
16.3 模板和继承
示例: 带备份的部分填充数组模板类
第17章 链式数据结构
17.1 节点和链表
节点
链表
在链表头插入节点
陷阱:丢失节点
插入和删除链表内的节点
陷阱:对动态数据结构使用赋值运算符
搜索链表
搜索函数伪代码
双向链表
为双向链表增加一个节点
从双向链表中删除一个节点
示例: 使用双向链表实现的通用排序模板函数
17.2 链表的应用
示例:栈模板类
示例:队列模板类
提示:命名空间的注解
友元类以及类似的其他选择
示例:包含节点链的哈希表
字符串哈希函数
哈希表的效率
示例:集合(set)模板类
集合的基本操作
链表创建的集合的效率
17.3 迭代器
指针作为迭代器
迭代器类
示例:迭代器类
17.4 树
树的属性
示例:树模板类
第18章 异常处理
18.1 异常处理基础
异常处理的简单样例
定义自己的异常类
多个抛出和捕获
陷阱:首先捕获比较明确的异常
提示:异常类可以很简单
在函数中抛出异常
异常说明
陷阱:派生类中的异常说明
18.2 异常处理的编程技术
抛出异常的时机
陷阱:未被捕获的异常
陷阱:嵌套try-catch块
陷阱:过度使用异常
异常类层次结构
可用内存测试
再次抛出异常
第19章 标准模板库
19.1 迭代器
迭代器基础
陷阱:编译器问题
迭代器的种类
常量迭代器和可变迭代器
反向迭代器
其他种类的迭代器
19.2 容器
连续容器
陷阱:迭代器和删除元素
提示:容器中的类型定义
容器适配器栈和队列
陷阱:底层容器
关联式容器set和map
效率
19.3 泛型算法
运行时间和大-O表示法
容器访问运行时间
不改变序列的算法
改变序列的算法
集合算法
排序算法
C++语言的起源
C++与面向对象编程
C++的特点
C++术语
C++程序示例
1.2 变量、表达式及赋值语句
标识符
变量
赋值语句
string类简介
陷阱:未初始化变量
提示:采用有意义的变量名
更多赋值语句
赋值兼容性
字面值
转义序列
命名常量
算数运算符和表达式
整数和浮点数除法
陷阱:全整数除法
类型转换
自增和自减运算符
陷阱:求值顺序
1.3 控制台输入/输出
使用cout输出
换行符
提示:以\n或endl结束程序
格式化浮点数
用cerr输出
用cin输入
提示:输入/输出中的换行
1.4 编程风格
注释
1.5 库与命名空间
库与include命令
命名空间
陷阱:库名的问题
第2章 流程控制
2.1 布尔表达式
创建布尔表达式
陷阱:不等式连写
布尔表达式求值
优先级规则
陷阱:整数值用作布尔值
2.2 分支机制
if-else语句
复合语句
陷阱:用=代替==
省略else
嵌套语句
多分支if-else语句
switch语句
陷阱:遗漏switch语句中的break
提示:在菜单中使用switch语句
枚举类型
条件运算符
2.3 循环
while和do-while循环
再谈自增和自减运算符
逗号运算符
for语句
提示:重复N次的循环
陷阱:for语句中额外的分号
陷阱:无限循环
break与continue语句
嵌套循环
2.4 文件输入简介
通过ifstream读取文本文件内容
第3章 函数基础
3.1 预定义函数
带有返回值的预定义函数
预定义的void函数
随机数生成器
3.2 自定义函数
定义带有返回值的函数
函数声明的另一种形式
陷阱:参数顺序的错误
调用函数的函数
示例:一个四舍五入的函数
返回布尔值的函数
定义void函数
void函数中的return语句
前提条件和运行结果
main函数
递归函数
3.3 作用域规则
局部变量
过程抽象
全局常量和全局变量
语句块
嵌套作用域
提示:在分支和循环语句中使用函数调用
for循环体中的变量声明
第4章 函数与重载
4.1 参数
传值参数
初识引用参数
引用传递调用机制详解
常量引用参数
示例:函数swapValues
提示:一种操作,而不是代码
混合参数列表
提示:使用何种参数
陷阱:无意的局部变量
提示:选择形参的名字
示例:买比萨
4.2 重载与默认实参
重载简介
陷阱:自动类型转换与重载
重载解析的规则
示例:改写“买比萨程序”
默认参数
4.3 函数的测试和调试
assert宏
占位程序和驱动程序
第5章 数组
5.1 数组简介
数组的声明和引用
提示:对数组使用for循环
陷阱:数组的索引始终是从0开始的
提示:使用已定义的常量作为数组的大小
内存中的数组
陷阱:数组越界
数组的初始化
5.2 函数中的数组
索引变量作为函数实参
整个数组作为函数实参
const修饰符
陷阱:const参数的不一致使用
返回数组的函数
示例:生产图表
5.3 用数组编程
部分填充的数组
提示:不要吝啬形参的使用
示例:查询数组
示例:给数组排序
5.4 多维数组
多维数组基础
多维数组参数
示例:使用二维数组的记分程序
第6章 结构体和类
6.1 结构体
结构体类型
陷阱:漏掉结构体定义末尾的分号
结构体作为函数参数
提示:使用多重结构体
结构体的初始化
6.2 类
定义类和成员函数
封装
公有成员和私有成员
取值和赋值函数
提示:接口和实现的分离
提示:封装的测试
结构体与类
提示:对象思考
第7章 构造函数及其他工具
7.1 构造函数
构造函数的定义
陷阱:无参构造函数
构造函数的显式调用
提示:总是为类定义一个默认构造函数
示例:BankAccount类
类类型成员变量
7.2 其他工具
const修饰符
陷阱:const的不一致用法
内联函数
静态成员
嵌套类和局部类定义
7.3 向量——标准模板库预览
向量基础
陷阱:方括号的索引超过向量的大小
提示:向量的赋值
效率问题
第8章 运算符重载、友元和引用
8.1 基本运算符的重载
重载基础
提示:构造函数可以返回一个对象
返回常量类型
一元运算符的重载
作为成员函数的运算符重载
提示:类可以访问其所有对象
重载函数调用符( )
陷阱:重载 &&、||及逗号运算符
8.2 友元函数与自动类型转换
构造函数的自动类型转换
陷阱:成员运算符和自动类型转换
友元函数
友元类
陷阱:不支持友元的编译器
8.3 引用和其他运算符重载
引用
提示:返回类的成员变量
重载“>>”和“<<”
提示:应使用什么样的返回值类型
赋值运算符
重载自增和自减运算符
重载数组运算符[ ]
基于左值和右值的重载
第9章 字符串
9.1 字符串类型数组
C字符串值和C字符串变量
陷阱:对C字符串使用 “=” 和 “==”
中的其他函数
示例: 命令行参数
C字符串的输入/输出
9.2 字符操作工具
字符的输入/输出
成员函数get和put
示例:使用换行函数检查输入
陷阱:输入时没有处理‘\n’
成员函数putback、peek和ignore
字符操作函数
陷阱:函数toupper和tolower返回int型数值
9.3 标准string类
标准string类简介
string类的输入和输出
提示:getline函数的其他版本
陷阱:对cin同时使用>>和getline
使用string类处理字符串
示例: 回文检测
string类对象和C字符串的转换
第10章 指针和动态数组
10.1 指针
指针变量
内存管理基础
陷阱:悬空指针
动态变量和自动变量
提示:定义指针类型
陷阱:指针用作传值参数
指针的应用
10.2 动态数组
数组变量和指针变量
创建并使用动态数组
示例:一个返回数组的函数
指针运算
多维动态数组
10.3 类、指针和动态数组
运算符->
this指针
重载赋值运算符
示例:部分填充数组的类
析构函数
拷贝构造函数
第11章 分散编译和命名空间
11.1 分散编译
封装回顾
头文件和实现文件
示例:DigitalTime类
提示:可重用的组件
使用#ifndef
提示:定义其他库
11.2 命名空间
命名空间和using指令
创建一个命名空间
using声明
限定名称
提示:为命名空间取名
示例:一个定义在命名空间中的类
无名称的命名空间
陷阱:混淆全局命名空间和无名称命名空间
提示:用无名称命名空间代替static修饰符
提示:隐藏帮助函数
嵌套命名空间
提示:应该如何指明使用的命名空间
第12章 流和文件I/O操作
12.1 I/O流
文件I/O
陷阱:流变量的使用限制
向文件追加输出内容
提示: 打开文件的另一种方法
提示:检查一个文件是否已被成功打开
字符I/O
文件结束检查
12.2 I/O流工具
使用文件名输入
使用流函数进行格式化输出
控制符
保存设置的标记
更多的输出流成员函数
示例:整理文件格式
示例:编辑文本文件
12.3 流的继承层次:继承概述
流之间的继承
示例:另一版本的newLine函数
使用类stringstream解析字符串
12.4 随机文件存取
第13章 递归
13.1 递归void函数
示例:竖直排列的数字
跟踪一个递归调用
深入理解递归
陷阱:无限递归
递归调用中的栈
陷阱:栈溢出
递归与迭代的比较
13.2 有返回值的递归函数
有返回值的递归函数的一般形式
示例:另一个幂函数
交叉递归
13.3 按递归方式思考问题
递归设计技巧
二分查找
编码
检查递归是否正确
效率
第14章 继承
14.1 继承基础
派生类
派生类的构造函数
陷阱:使用基类的私有成员变量
陷阱:私有成员函数是无法被有效继承的
protected限定符
成员函数的重定义
重定义与重载
访问被重定义过的基类函数
不可被继承的函数
14.2 利用继承编程
派生类中的赋值运算符和拷贝构造函数
派生类的析构函数
示例:可备份的部分填充的数组
陷阱:赋值运算符两边是同一个对象
示例:PFArrayDBak的另一种实现
提示:一个类可以访问本类所有对象的私有成员
提示:“是一个”和“有一个”
保护继承和私有继承
多继承
第15章 多态与虚函数
15.1 虚函数基础
延迟绑定
C++中的虚函数
提示:virtual属性会被继承
提示:什么时候应该使用虚函数
陷阱:没有对虚成员函数进行定义
抽象类与纯虚函数
示例:抽象类
15.2 指针和虚函数
虚函数与扩展类型兼容性
陷阱:切片问题
提示:使析构函数成为虚函数
向下类型转换和向上类型转换
C++如何实现虚函数
第16章 模板
16.1 函数模板
函数模板语法
陷阱:编译器的复杂性
提示:如何定义模板
示例:一个通用的排序函数
陷阱:使用模板时误用了不正确的数据类型
16.2 类模板
类模板语法
示例:一个数组模板类
模板中的vector和 basic_string
16.3 模板和继承
示例: 带备份的部分填充数组模板类
第17章 链式数据结构
17.1 节点和链表
节点
链表
在链表头插入节点
陷阱:丢失节点
插入和删除链表内的节点
陷阱:对动态数据结构使用赋值运算符
搜索链表
搜索函数伪代码
双向链表
为双向链表增加一个节点
从双向链表中删除一个节点
示例: 使用双向链表实现的通用排序模板函数
17.2 链表的应用
示例:栈模板类
示例:队列模板类
提示:命名空间的注解
友元类以及类似的其他选择
示例:包含节点链的哈希表
字符串哈希函数
哈希表的效率
示例:集合(set)模板类
集合的基本操作
链表创建的集合的效率
17.3 迭代器
指针作为迭代器
迭代器类
示例:迭代器类
17.4 树
树的属性
示例:树模板类
第18章 异常处理
18.1 异常处理基础
异常处理的简单样例
定义自己的异常类
多个抛出和捕获
陷阱:首先捕获比较明确的异常
提示:异常类可以很简单
在函数中抛出异常
异常说明
陷阱:派生类中的异常说明
18.2 异常处理的编程技术
抛出异常的时机
陷阱:未被捕获的异常
陷阱:嵌套try-catch块
陷阱:过度使用异常
异常类层次结构
可用内存测试
再次抛出异常
第19章 标准模板库
19.1 迭代器
迭代器基础
陷阱:编译器问题
迭代器的种类
常量迭代器和可变迭代器
反向迭代器
其他种类的迭代器
19.2 容器
连续容器
陷阱:迭代器和删除元素
提示:容器中的类型定义
容器适配器栈和队列
陷阱:底层容器
关联式容器set和map
效率
19.3 泛型算法
运行时间和大-O表示法
容器访问运行时间
不改变序列的算法
改变序列的算法
集合算法
排序算法
完美C++(第5版)
光盘服务联系方式: 020-38250260 客服QQ:4006604884
云图客服:
用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问
Video Player
×
Audio Player
×
pdf Player
×