第1章 开始学习C/C++ 1
1.1 开发平台 1
1.2 第一个程序 1
1.2.1 代码解析 2
1.2.2 在Windows XP环境下的问题 2
1.2.3 常见的问题 2
1.3 代码与程序 3
1.4 C语言和C++语言 3
第2章 控制台输入与输出 4
2.1 控制台输出 4
2.1.1 输出整数 5
2.1.2 用变量表示整数 5
2.1.3 指定显示宽度 6
2.1.4 输出小数 7
2.1.5 用变量表示小数 8
2.1.6 指定小数点后的位置 8
2.2 控制台输入 8
2.2.1 输入整数 9
2.2.2 输入小数 9
2.2.3 一次输入多个数 10
2.3 注释 11
2.4 空白 12
2.5 常见问题 12
2.6 综合例题 13
第3章 变量与常量 14
3.1 变量 14
3.1.1 变量的定义 14
3.1.2 变量的命名 15
3.1.3 变量的赋值 16
3.2 整型变量 16
3.2.1 char/short/int类型 16
3.2.2 unsigned无符号类型 17
3.2.3 bool布尔类型 18
3.2.4 enum枚举类型 18
3.2.5 long long长整数类型 18
3.3 浮点型变量 18
3.4 数的进制表示 19
3.4.1 数的十进制表示 19
3.4.2 数的十六进制表示 19
3.4.3 数的二进制表示 20
3.5 变量与内存 20
3.5.1 二进制存储 20
3.5.2 内存 21
3.5.3 变量的大小 21
3.5.4 变量在内存中的表示 22
3.5.5 变量的地址 22
3.5.6 理解变量的赋值 23
3.6 const常量 23
3.7 字面常量 24
3.8 常用类型的范围 25
第4章 数组 26
4.1 引例 26
4.2 数组的定义 26
4.2.1 数组的命名 27
4.2.2 数组的长度 27
4.3 数组的基本使用方法 27
4.3.1 数组的初始值 27
4.3.2 访问数组中的元素 28
4.3.3 用sized取得数组的大小 29
4.4 数组的内存视图 29
4.5 常见问题 30
4.6 数组的使用实例 31
4.6.1 实例1 31
4.6.2 实例2 31
4.6.3 实例3 31
4.6.4 实例4 31
4.7 多维数组 32
4.7.1 二维问题的表示 32
4.7.2 二维数组的定义 32
4.7.3 二维数组的初始化 33
4.7.4 二维数组的本质 33
第5章 字符与字符数组 34
5.1 字符是什么 34
5.2 字符的表示 35
5.3 字符的显示 35
5.4 字符常量 35
5.5 字符数组 36
5.5.1 输出字符串 37
5.5.2 输入字符串 37
5.5.3 理解结束符的作用 37
5.5.4 字符串的截断 38
5.5.5 常见问题 38
5.6 转义字符 38
5.6.1 转义字符的概念 38
5.6.2 转义字符的使用举例 39
第6章 表达式与操作符 41
6.1 算术表达式 41
6.2 赋值表达式 42
6.2.1 左值 42
6.2.2 理解赋值运算 42
6.2.3 赋值与算术运算合并 43
6.2.4 等号串连的写法 43
6.3 关系表达式 43
6.4 条件表达式 44
6.5 逻辑表达式 45
6.6 逗号表达式 46
6.7 自增/自减操作符 47
6.8 位操作符 48
6.8.1 按位表示 48
6.8.2 位运算规则 48
6.8.3 移位操作 50
6.8.4 应用举例 51
6.8.5 例题:把unsigned int整数转为4个字节 52
6.9 类型的转换与提升 52
6.10 优先级与结合顺序 53
6.10.1 使用括号 54
6.10.2 常用的优先级 54
第7章 语句 55
7.1 什么叫语句 55
7.2 if语句 56
7.2.1 使用复合语句 57
7.2.2 最简形式if 58
7.2.3 完全形式if…else if…else if…else 59
7.3 switch语句 60
7.3.1 匹配 61
7.3.2 跳转与执行 62
7.3.3 注意事项 62
7.4 for语句 64
7.4.1 引例 64
7.4.2 使用for语句 64
7.4.3 变形1:省略初始表达式 65
7.4.4 变形2:省略第二个表达式 65
7.4.5 变形3:省略后置表达式 66
7.4.6 变形4:全部置空 66
7.4.7 存在break语句 66
7.4.8 存在continue语句 66
7.5 while语句 67
7.5.1 变形:条件判断内置 68
7.5.2 例题 68
7.6 do…while语句 69
7.7 综合例题1 70
7.8 综合例题2 71
第8章 函数 73
8.1 引例 73
8.2 初步认识函数 73
8.3 函数的定义 75
8.3.1 函数名 75
8.3.2 参数列表 75
8.3.3 返回值类型 76
8.3.4 函数的实现 76
8.3.5 return语句的用法 76
8.4 函数的调用 77
8.4.1 函数的调用过程 77
8.4.2 参数的顺序 78
8.4.3 函数的传值调用 78
8.4.4 忽略返回值 79
8.4.5 直接使用返回值 80
8.5 全局变量和局部变量 80
8.6 变量的作用域与生命期 81
8.6.1 变量的作用域 81
8.6.2 变量的生命期 82
8.7 变量名重名问题 82
8.8 函数声明与函数定义 84
8.8.1 函数的声明 85
8.8.2 函数声明相关问题 86
8.9 main函数 86
8.10 参数的隐式转换 86
8.11 函数名重载 87
8.12 重载函数的匹配 88
8.12.1 精确匹配 88
8.12.2 模糊匹配 88
8.13 参数的默认值 90
8.14 内联函数 91
8.15 函数的递归调用 91
第9章 指针 94
9.1 内存地址的表示 94
9.2 指针的概念 94
9.3 星号操作 96
9.4 指针与数组 97
9.4.1 指针加减法 98
9.4.2 指针与数组的转换 98
9.5 指针作为函数的参数 99
9.6 数组作为函数的参数 101
9.7 指针作为函数的返回值 102
9.8 const指针 103
9.9 void型指针 104
9.10 安全地使用指针 105
9.11 二重指针 108
9.12 二维数组与指针 108
9.12.1 作为函数的参数 109
9.12.2 二维数组与指针的转换 109
第10章 结构体 111
10.1 引例 111
10.2 结构体概述 113
10.3 结构体的基本用法 113
10.3.1 变量定义和初始化 113
10.3.2 访问结构体的成员 114
10.3.3 定义结构体数组 114
10.4 结构体的内存视图 115
10.4.1 结构体的成员 115
10.4.2 对齐与填充 116
10.5 结构体的更多用法 117
10.5.1 结构体的赋值 117
10.5.2 结构体指针 117
10.5.3 作为函数的参数 117
10.5.4 作为函数的返回值 118
10.5.5 作为结构体的成员 118
10.6 结构体的特殊写法 119
10.6.1 没有类型名 119
10.6.2 函数内部的结构体类型 119
10.6.3 紧凑的形式 120
10.6.4 C语言中的struct定义 120
10.7 结构体的命名 121
10.8 传值与传地址 121
10.9 位字段bit-field 122
10.10 实例 123
第11章 联合体 125
11.1 概念 125
11.2 进一步理解union 126
11.3 实例 127
11.4 union的替代方案 128
第12章 动态分配内存 130
12.1 引例 130
12.2 动态分配内存 130
12.3 内存管理器与堆 131
12.4 对象的生命期 133
12.5 实例1 134
12.6 实例2 135
12.7 常见问题 136
第13章 链表 138
13.1 概念 138
13.2 链表的构造 138
13.2.1 头节点与末节点 139
13.2.2 链表头的作用 139
13.2.3 常见问题 139
13.3 有头链表 140
13.3.1 概念 140
13.3.2 定义一个有头链表 140
13.3.3 添加一个节点 141
13.3.4 有头链表的遍历 142
13.3.5 按顺序插入节点 142
13.3.6 查找和删除节点 143
13.3.7 和无头链表的比较 143
第14章 引用 144
14.1 引用的定义 144
14.2 与指针的区别 144
14.3 简单的例子 145
14.4 作为函数的参数 146
14.5 作为函数的返回值 147
14.6 const引用 148
第15章 字符串 149
15.1 字符串的三种形式 149
15.2 字符串常量的多行表示 150
15.3 字符串与普通数据 151
15.4 字符串的遍历 151
15.5 字符串长度 152
15.6 字符串复制 153
15.7 字符串比较 154
15.8 字符串插入和删除 155
15.8.1 删除字符 155
15.8.2 插入字符 156
15.8.3 插入和删除的效率问题 156
15.9 字符串的分割 157
15.10 用数组还是用指针 159
第16章 标准C函数库 162
16.1 stdio.h 162
16.2 math.h 164
16.3 time.h 165
16.3.1 time_t 166
16.3.2 struct tm 166
16.3.3 time取得系统当前时间 167
16.3.4 localtime得到年月日时分秒 167
16.3.5 mktime构造时间 168
16.4 stdlib.h 169
16.5 string.h 171
第17章 文件操作 175
17.1 认识文件 175
17.2 保存数据 176
17.2.1 fopen打开文件 176
17.2.2 fclose关闭文件 177
17.2.3 fwrite写入数据 177
17.3 读取数据 177
17.4 数据的存储格式 179
17.5 存储格式:按字节存储 180
17.5.1 指针指向的对象 181
17.5.2 Run-Length Encoding存储 182
17.6 存储格式:文本化存储 183
17.6.1 fprintf按行格式化写入 183
17.6.2 fgets按行读取 184
17.7 文件的随机访问 184
17.7.1 fseek随机访问 184
17.7.2 文件位置指示器 185
17.7.3 随机访问示例 185
17.7.4 fseek的物理限制 186
17.7.5 文件被重复打开的情况 186
17.8 文件打开模式 186
17.9 常见问题 187
第18章 多文件项目及编译过程 188
18.1 extern 188
18.1.1 extern声明全局函数 188
18.1.2 extern声明全局变量 189
18.1.3 深入理解extern 190
18.2 多文件项目的生成 190
18.2.1 第一阶段:编译 190
18.2.2 第二阶段:链接 191
18.2.3 用伪代码表示整个过程 192
18.2.4 全量编译与增量编译 193
18.3 头文件#include指令 193
18.3.1 为什么需要头文件 193
18.3.2 使用头文件 195
18.3.3 # include指令的原理 196
18.3.4 头文件的重复包含问题 196
18.3.5 头文件里的内容 197
18.4 宏定义#define指令 197
18.4.1 #define一个数值 198
18.4.2 #define一个算式 199
18.4.3 几个常见的宏定义 200
18.5 条件编译指令#if 200
18.5.1 #if…#endif 200
18.5.2 #ifdef…#endif 200
18.5.3 解决头文件重复包含的问题 201
18.6 main函数的参数和返回值 202
18.6.1 main函数的参数 202
18.6.2 main函数的返回值 204
18.7 static的用法 204
18.7.1 static修饰变量 204
18.7.2 static修饰函数 205
第19章 面向对象编程 206
19.1 面向对象设计的过程 206
19.2 实例演示 206
19.2.1 需求与设计 206
19.2.2 写出代码框架 207
19.2.3 实现各个函数接口 209
19.3 封装 210
第20章 类 212
20.1 类和成员变量 212
20.1.1 了解访问修饰符 213
20.1.2 访问修饰符的用法 213
20.2 类和成员函数 214
20.2.1 访问修饰符的限制 215
20.2.2 了解this指针 216
20.2.3 this指针的用法 217
20.3 变量名字的覆盖 218
20.4 命名规范 220
20.4.1 类名的命名规范 220
20.4.2 成员函数的命名规范 221
20.4.3 成员变量的命名规范 221
20.5 类的封装 222
20.6 类的分离式写法 223
20.7 const对象与const函数 224
20.7.1 const成员函数 224
20.7.2 const版本与非const版本 224
第21章 构造与析构 226
21.1 引例 226
21.2 构造函数 226
21.2.1 重载构造函数 227
21.2.2 构造函数的调用 227
21.3 析构函数 229
21.3.1 析构函数的调用 229
21.3.2 在析构函数中释放资源 230
21.4 自动生成的构造/析构函数 231
21.5 默认构造函数 232
21.6 构造函数的初始化列表 232
21.6.1 参数名与成员变量名可以相同 233
21.6.2 成员本身也是class类型 233
21.6.3 混合使用两种初始化方式 234
21.6.4 必须使用初始化列表的情形 234
21.7 构造与析构的顺序 235
21.8 分离式写法 236
21.9 无名对象 237
21.10 构造函数与类型转换 237
第22章 动态创建对象 239
22.1 回顾malloc/free 239
22.2 用new/delete创建/销毁对象 240
22.3 new/delete与malloc/free的区别 241
22.4 为new指定初始化参数 241
22.5 默认构造函数的必要性 243
22.6 注意事项 243
第23章 继承 244
23.1 引例 244
23.2 继承的概念 244
23.3 访问修饰符protected 246
23.4 成员函数的重写 247
23.5 虚拟继承 248
23.5.1 父类指针指向子类对象 248
23.5.2 虚函数virtual 249
23.5.3 virtual析构函数 250
23.6 继承关系下的构造与析构 250
23.7 多重继承 251
23.8 继承函数与纯虚类 252
23.9 以protected/ private方式继承 253
第24章 拷贝构造函数 254
24.1 定义 254
24.2 拷贝构造函数的调用 254
24.3 默认的拷贝构造函数 256
24.4 定义拷贝构造函数 256
24.5 深度拷贝 258
第25章 静态成员 260
25.1 static定义全局变量 260
25.2 static定义全局函数 261
25.3 与普通成员的区别 263
25.4 static语法的特点 264
25.5 应用1:实例计数 265
25.6 应用2:单例模式 267
第26章 朋友成员 269
26.1 引例 269
26.2 类的朋友 269
26.3 friend的语法 270
26.4 实例 270
26.5 进一步讨论 271
第27章 重载操作符 273
27.1 引例 273
27.2 算术操作符 274
27.2.1 参数类型 275
27.2.2 加法的互换性 275
27.3 赋值操作符= 276
27.3.1 赋以不同的类型 276
27.3.2 深拷贝 277
27.3.3 相关问题及注意事项 278
27.3.4 检查项列表 279
27.4 自增操作符++与自减操作符—— 279
27.5 关系操作符 280
27.6 逻辑操作符 281
27.7 类型转换操作符 281
27.8 元素操作符[] 282
27.9 输入输出操作符〉〉与〈〈 283
27.10 操作符new与delete 284
27.11 小结 284
第28章 内部类和名字空间 285
28.1 内部类 285
28.1.1 内部类的语法 285
28.1.2 内部类和普通类的区别 286
28.1.3 内部类的用途 286
28.1.4 内部类的分离式写法 286
28.1.5 内部enum类型 287
28.2 名字空间 288
28.2.1 名字空间的定义 288
28.2.2 分离式写法 289
28.2.3 using语句:解除前缀 290
28.2.4 名字空间里的其他类型 291
28.2.5 名字空间的应用场景 291
第29章 模板 292
29.1 函数模板 292
29.2 类模板 294
29.3 模板参数 295
29.4 实例 295
第30章 标准模板库 298
30.1 一般使用方法 298
30.2 向量vector 299
30.2.1 at/front/back 300
30.2.2 push_back/pop_ back/resize/clear 301
30.2.3 it erator/const_ iterator 302
30.2.4 insert/erase 303
30.3 list 304
30.3.1 push_back/pop_back/push_front/pop_front 305
30.3.2 size/clear 305
30.3.3 front/back 305
30.3.4 iterator 306
30.3.5 insert/erase 306
30.4 string 307
30.4.1 append/clear 308
30.4.2 size/capacity/resize/clear/length 308
30.4.3 at 309
30.4.4 字符串比较 309
30.4.5 字符串查找 310
30.4.6 substr 311
30.4.7 insert/replace 311
30.4.8 string作为函数参数 312
30.5 map 313
30.5.1 使用[]插入数据 314
30.5.2 使用insert插入数据 314
30.5.3 查找 315
30.5.4 遍厉 315
30.5.5 删除 315
30.6 stack 316
30.7 queue 316
第31章 异常 317
31.1 一个例子 317
31.1.1 throw 318
31.1.2 try…catch 319
31.2 try的用法 320
31.3 catch的用法 321
31.3.1 匹配所有类型 321
31.3.2 异常必须被捕获 322
31.4 throw的用法 323
31.5 常见问题 324
31.5.1 异常与错误的区别 324
31.5.2 不在构造函数中抛出异常 325
31.5.3 不在析构函数中抛出异常 325
31.5.4 关于finally 325
附录A 用VC2008创建项目 326
附录B 有符号整数与无符号整数 335
附录C 枚举类型 336
附录D VC2008调试方法 338
附录E VS2008常见问题汇总 346
附录F 字面常量 350
附录G ASCII码表 351
附录H 位字段 355
附录I typedef的用法 360
附录J 编码规范 361
附录K C++与C语言的区别 370
附录L 二进制、十进制与十六进制 375