前言
第一篇 C++基础
第1章 C++概述
1.1 了解计算机
1.1.1 计算机硬件
1.1.2 计算机软件
1.2 程序设计语言
1.2.1 机器语言
1.2.2 汇编语言
1.2.3 高级语言
1.2.4 数据结构和算法
1.2.5 面向过程的程序设计(POP)
1.2.6 面向对象的程序设计(OOP)
1.3 C++概述
1.3.1 C++语言发展历程
1.3.2 C++语言特点
1.3.3 C++程序开发基本过程
1.4 C++开发环境的搭建
1.4.1 Visual C++ 6开发环境简介
1.4.2 开发步骤
1.5 第一个C++程序
1.6 C语言与C++语言的区别
1.6.1 程序设计思想的区别
1.6.2 语法规范的区别
1.7 小结
1.8 习题
第2章 开始C++之旅
2.1 C++程序的结构
2.1.1 C++的注释风格
2.1.2 编译预处理与新旧标准
2.1.3 主函数
2.1.4 名称空间
2.1.5 C++语素
2.1.6 缩进与对齐
2.2 变量与基本类型
2.2.1 变量
2.2.2 整型
2.2.3 浮点型
2.2.4 基本字符型
2.2.5 宽字符型
2.2.6 布尔型
2.3 常量
2.3.1 整型常量和浮点型常量
2.3.2 字符型常量
2.3.3 字符串常量
2.3.4 符号常量
2.3.5 枚举常量
2.4 运算符与表达式
2.4.1 算术运算
2.4.2 逻辑运算
2.4.3 短路表达式
2.4.4 关系运算
2.4.5 大有文章:变量是否为"0"
2.4.6 条件运算
2.4.7 位运算
2.4.8 赋值运算
2.4.9 ++和--
2.4.10 逗号表达式
2.4.11 sizeof运算符与sizeof表达式
2.4.12 运算符的优先级和结合性
2.5 类型转换
2.5.1 赋值转换
2.5.2 表达式中的转换
2.5.3 强制类型转换
2.5.4 函数调用和传递参数时的类型转换
2.6 流程控制语句
2.6.1 if…else…选择结构
2.6.2 switch结构
2.6.3 if…else…结构和switch结构的比较
2.6.4 for循环结构
2.6.5 for循环结构嵌套
2.6.6 while循环结构
2.6.7 do…while循环结构
2.6.8 循环语句的效率
2.6.9 流程转向控制语句之break
2.6.10 流程转向控制语句之continue
2.6.11 流程转向控制语句之goto
2.6.12 程序终止函数exit()
2.7 小结
2.8 习题
第二篇 C++过程开发
第3章 数组和C风格字符串
3.1 什么是数组
3.2 一维数组
3.2.1 一维数组的声明
3.2.2 初始化一维数组
3.2.3 一维数组应用举例
3.2.4 数组操作注意事项
3.3 C风格字符串
3.3.1 C风格字符串的声明
3.3.2 字符数组的cin和cout
3.3.3 get()函数和getline()函数
3.3.4 cin与get()/getline()函数的搭配问题
3.3.5 访问C风格字符串中的某个元素
3.3.6 C风格字符串处理函数
3.4 二维数组及多维数组
3.4.1 声明一个二维数组
3.4.2 初始化二数组
3.4.3 二维数组应用举例
3.4.4 二维数组在内存中是如何排列元素的
3.4.5 三维数组在内存中是如何排列元素的
3.5 小结
3.6 习题
第4章 指针和引用
4.1 指针的定义与使用
4.1.1 为什么使用指针
4.1.2 声明一个指针变量
4.1.3 初始化指针变量
4.1.4 指向指针的指针
4.1.5 指针赋值
4.2 指针的运算
4.2.1 指针与整数的加减
4.2.2 同类型指针间的比较
4.2.3 同类型指针相减
4.3 动态内存分配
4.3.1 使用new动态分配内存
4.3.2 使用delete释放动态申请的内存
4.3.3 使用new申请动态数组
4.3.4 不要使用或释放已经释放的内存块
4.3.5 使用malloc和free动态申请内存
4.3.6 动态内存申请并不一定能成功
4.4 指针和const
4.4.1 禁止改写指针(常量指针或常指针)
4.4.2 禁止改写间接引用
4.4.3 既禁止改写指针,又禁止改写间接引用
4.5 指针与数组
4.5.1 数组名指针
4.5.2 数组元素的指针形式
4.5.3 指向数组的指针(数组指针)
4.5.4 指针数组
4.5.5 指针与多维数组
4.5.6 指针与字符数组
4.6 引用
4.6.1 引用的声明
4.6.2 引用的特点
4.6.3 引用的使用限制
4.6.4 其他要说明的问题
4.7 小结
4.8 习题
第5章 结构、共用体和链表
5.1 结构
5.1.1 如何定义一个结构
5.1.2 结构变量的声明和使用
5.1.3 结构变量的初始化
5.1.4 结构变量间是否可以相互赋值
5.1.5 结构体变量的sizeof
5.1.6 结构体的复杂形式
5.2 共用体
5.2.1 共用体的定义
5.2.2 共用体和结构的区别
5.2.3 共用体变量的声明和初始化
5.2.4 共用体使用举例
5.2.5 共用体的sizeof
5.3 结构数组和共用体数组
5.3.1 结构数组的声明和初始化
5.3.2 共用体数组的声明和初始化
5.4 指向结构的指针
5.4.1 声明一个结构指针
5.4.2 结构指针的初始化
5.4.3 使用指针访问结构成员
5.5 链表
5.5.1 链表的结构
5.5.2 创建链表
5.5.3 链表与数组的区别
5.5.4 链表的遍历和查找
5.5.5 链表的插入和删除
5.5.6 删除整个链表
5.6 小结
5.7 习题
第6章 用函数合理组织程序
6.1 模块化带来的好处
6.1.1 函数的调用过程
6.1.2 抽象和封装
6.1.3 实现一个函数
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.4.3 值传递
6.4.4 指针传递
6.4.5 引用传递
6.4.6 对3种传递的补充
6.4.7 缺省参数调用
6.4.8 内联函数inline
6.5 递归
6.6 函数的重载
6.6.1 什么是函数重载
6.6.2 何时使用函数重载
6.6.3 如何实现函数重载
6.6.4 陷阱:隐式转换导致重载函数出现二义性
6.7 C++如何使用内存
6.7.1 自动存储(栈存储)
6.7.2 静态存储(编译器预分配)
6.8 作用域与可见域
6.8.1 作用域
6.8.2 可见域
6.8.3 函数的作用域和可见域
6.9 小结
6.10 习题
第7章 关于函数的高级专题
7.1 内存使用错误剖析
7.1.1 内存泄露
7.1.2 野指针
7.1.3 试图修改常量
7.1.4 用错sizeof
7.1.5 内存越界访问
7.1.6 变量的初始化
7.2 重申:函数参数传递和返回机制
7.2.1 参数传递时的"副本"
7.2.2 函数返回时的"副本"
7.3 函数与指针
7.3.1 指向函数的指针
7.3.2 typedef关键字
7.3.3 通过函数指针将函数作为另一个函数的参数
7.3.4 函数指针数组
7.3.5 返回函数指针的函数
7.3.6 带参主函数
7.4 函数与数组
7.4.1 数组名作函数参数
7.4.2 通过指针得到多于1个的回传值
7.5 函数与结构体、共用体及类对象
7.5.1 3种参数调用
7.5.2 3种返回机制
7.6 函数编写的建议
7.6.1 合理使用const
7.6.2 检查输入参数的有效性
7.6.3 函数返回类型的判断
7.7 小结
7.8 习题
第三篇 面向对象的C++
第8章 面向对象编程基础
8.1 面向对象的基本概念
8.1.1 面向对象开发的优势
8.1.2 什么是类
8.1.3 类是分层的
8.1.4 类和对象的关系
8.2 C++类的定义
8.2.1 类定义的基本形式
8.2.2 类定义示例
8.2.3 类和结构体
8.3 C++类的实现
8.3.1 在类定义时定义成员函数
8.3.2 在类定义的外部定义成员函数
8.4 C++类的使用
8.4.1 声明一个对象
8.4.2 对象的作用域、可见域和生存期
8.5 对象的创建和撤销
8.5.1 构造函数的作用
8.5.2 构造函数可以有参数
8.5.3 构造函数支持重载
8.5.4 构造函数允许按参数默认方式调用
8.5.5 初始化表达式
8.5.6 析构函数
8.5.7 显式调用析构函数
8.6 复制构造函数
8.6.1 复制构造函数调用机制
8.6.2 默认复制构造函数带来的问题
8.6.3 解决方案--显式定义复制构造函数
8.6.4 关于构造函数和复制构造函数
8.7 特殊数据成员
8.7.1 const数据成员
8.7.2 引用成员
8.7.3 类对象成员
8.7.4 static数据成员
8.8 特殊函数成员
8.8.1 静态成员函数
8.8.2 const与成员函数
8.9 对象的组织
8.9.1 const对象
8.9.2 指向对象的指针
8.9.3 对象的大小
8.9.4 this指针
8.9.5 对象数组
8.9.6 对象链表
8.10 为对象动态分配内存
8.10.1 使用new和delete为单个对象分配/释放动态内存
8.10.2 使用new和delete[]为对象数组分配/释放动态空间
8.10.3 malloc/free与new/delete
8.11 小结
8.12 习题
第9章 关于对象的高级专题
9.1 类的作用域
9.2 类定义的作用域与可见域
9.3 对象的生存期、作用域和可见域
9.3.1 先定义,后实例化
9.3.2 对象内存释放与堆内存
9.4 友元
9.4.1 认识友元函数
9.4.2 友元的非成员函数
9.4.3 友元的成员函数
9.4.4 友元函数的重载
9.4.5 友元类
9.4.6 友元是否破坏了封装性
9.5 运算符重载
9.5.1 运算符重载规则
9.5.2 运算符重载的优点
9.5.3 以成员函数形式重载运算符
9.5.4 以友元函数形式重载运算符
9.5.5 友元函数形式和成员函数形式的比较
9.5.6 对运算符重载的补充说明
9.6 运算符重载范例
9.6.1 赋值运算符
9.6.2 函数调用运算符
9.6.3 下标运算符
9.7 类型转换
9.7.1 由其他类型向定义类的转换
9.7.2 由自定义类向其他类型的转换
9.7.3 隐式转换带来的二义性
9.8 小结
9.9 习题
第10章 继承
10.1 什么是继承
10.1.1 简单示例
10.1.2 继承的层次性
10.2 基类和派生类
10.2.1 基类
10.2.2 public派生与private派生
10.2.3 protected成员与protected派生
10.3 多基派生
10.3.1 多基派生的声明和定义
10.3.2 二义性问题
10.3.3 消除二义性的解决方案
10.4 虚基类
10.4.1 共同基类带来的二义性
10.4.2 解决共同基类带来的二义性
10.4.3 虚基派生二义性与多基派生二义性不同
10.5 派生类的构造函数和析构函数
10.5.1 派生类的构造函数
10.5.2 派生类的析构函数
10.5.3 多基派生类的构造函数和析构函数
10.5.4 虚基派生的构造函数和析构函数
10.6 分清继承还是组合
10.6.1 继承不是万能的
10.6.2 组合
10.7 基类与派生类对象间的相互转换
10.7.1 类型适应
10.7.2 多基继承时的情况
10.7.3 公共基类
10.7.4 虚基类的情况
10.8 小结
10.9 习题
第11章 多态
11.1 多态与虚函数
11.1.1 静态联编
11.1.2 动态联编
11.1.3 为什么需要虚函数
11.1.4 虚函数的声明和定义
11.2 虚函数的访问
11.2.1 对象名访问
11.2.2 基指针访问
11.2.3 引用访问
11.2.4 类内访问
11.2.5 在构造函数或析构函数中进行访问
11.3 纯虚函数与抽象类
11.3.1 纯虚函数的声明和定义
11.3.2 抽象类
11.3.3 另一种抽象类:类中只定义了protected型的构造函数
11.3.4 延伸:构造函数能否为private型
11.3.5 虚析构函数
11.4 虚函数引入的二义性
11.4.1 多基派生
11.4.2 共同基类和虚继承
11.5 重载、覆盖与隐藏
11.5.1 重载
11.5.2 覆盖
11.5.3 隐藏
11.6 小结
11.7 习题
第四篇 泛型编程
第12章 模板
12.1 为什么要定义模板
12.1.1 类型参数化
12.1.2 模板的定义
12.2 函数模板
12.2.1 函数模板的定义
12.2.2 函数模板的使用
12.2.3 隐式实例化
12.2.4 显式实例化
12.2.5 特化
12.2.6 重载
12.2.7 优先级与执行顺序
12.3 类模板
12.3.1 定义类模板
12.3.2 隐式实例化
12.3.3 显式实例化
12.3.4 显式特化
12.3.5 部分特化
12.3.6 重载和优先级
12.4 模板的嵌套
12.4.1 函数成员模板
12.4.2 对象成员模板
12.5 模板参数
12.6 小结
12.7 习题
第13章 标准模板库
13.1 理解STL
13.1.1 容器
13.1.2 适配器
13.1.3 迭代器
13.1.4 算法
13.2 使用序列式容器
13.2.1 序列式容器的创建和元素的访问
13.2.2 所有容器都支持的特征
13.2.3 序列式容器中元素的插入和删除
13.2.4 vector容器、deque容器和list容器的比较
13.3 使用关联式容器
13.3.1 set容器
13.3.2 multiset容器
13.3.3 map容器
13.3.4 multimap容器
13.4 关联式容器支持的成员函数操作
13.4.1 元素的插入
13.4.2 元素的删除
13.4.3 元素的查找与访问
13.5 迭代器
13.5.1 理解迭代器的本质
13.5.2 迭代器的5种类型简介
13.5.3 为什么要定义这么多迭代器
13.5.4 容器中定义的迭代器类型与5种类型的对应
13.5.5 流迭代器
13.5.6 前向迭代器、双向迭代器和随机访问迭代器
13.5.7 混合迭代器函数
13.5.8 迭代器失效
13.6 泛型算法
13.6.1 什么是函数对象
13.6.2 算法分类
13.7 适配器
13.7.1 容器适配器
13.7.2 迭代器适配器
13.7.3 函数适配器
13.8 小结
13.9 上机实践习题
第五篇 输入输出处理和编程规范
第14章 输入输出和文件
14.1 输入/输出概述
14.1.1 什么是文件
14.1.2 流
14.1.3 缓冲区
14.1.4 重定向
14.1.5 3种输入/输出机制
14.2 高层I/O
14.2.1 标准输出函数printf()
14.2.2 标准输入函数scanf()
14.2.3 扫描集
14.2.4 sprintf()函数和sscanf()函数
14.2.5 fprintf()函数和fscanf()函数
14.2.6 文件访问机制
14.3 流类库
14.3.1 流类库更安全、更高效
14.3.2 流类库层次
14.4 输出流
14.4.1 操作符>操作符
14.5.2 输入流与格式状态字
14.5.3 输入流与域宽
14.5.4 使用get()函数读取单个字符
14.5.5 使用get()和getline()函数读取C风格字符串
14.5.6 其他istream方法
14.6 流状态
14.6.1 什么是流状态
14.6.2 读取流状态
14.6.3 管理流状态
14.7 重载>>和