第一部分 进入C+的世界 3
第1章 简介和环境搭建 3
1.1什么是编程语言 3
1.2 C和C+++之间的不同之处 3
1.3学习C+++之前,是否需要先了解C 3
1.4成为程序员,是否需要懂数学 4
1.5术语 4
1.5.1编程 4
1.5.2可执行文件 4
1.6编辑和编译源文件 4
1.7关于示例源代码 5
1.8 Windows 5
1.8.1第1步:下载Code::Blocks 5
1.8.2第2步:安装Code::Blocks 5
1.8.3第3步:运行Code::Blocks 6
1.8.4错误调试 9
1.8.5使用Code::Blocks的原因 11
1.9 Macintosh 11
1.9.1 Xcode 12
1.9.2安装Xcode 5 12
1.9.3运行Xcode 12
1.9.4用Xcode创建第一个C++++程序 12
1.9.5安装Xcode 6beta 16
1.9.6运行Xcode 16
1.9.7用Xcode创建第一个C++++程序 17
1.9.8错误调试 20
1.10 Linux 21
1.10.1步骤1:安装g++++ 21
1.10.2步骤2:运行g++++ 22
1.10.3步骤3:运行你的程序 22
1.10.4步骤4:安装文本编辑器 23
1.10.5配置nano 23
1.10.6使用nano 23
第2章 C++基础 27
2.1 C+++简介 27
2.1.1最简单的C++++程序 27
2.1.2程序无法运行的原因 29
2.1.3 C++++程序的基本结构 30
2.2为程序添加注释 30
2.3像程序员一样思考,创建可复用的代码 31
2.4痛并快乐着的练习 32
2.5问答题 32
2.6实践题 33
第3章 用户交互和变量 34
3.1变量 34
3.1.1 C++++中的变量声明 34
3.1.2使用变量 34
3.1.3程序闪退的处理方法 35
3.1.4修改、使用和比较变量 36
3.1.5加减1的简写 36
3.2变量的使用和滥用 38
3.2.1 C++++中声明变量的常见错误 38
3.2.2区分大小写 39
3.2.3变量命名 39
3.3字符串存储 40
3.4基本类型的存储解析 42
3.5问答题 43
3.6实践题 44
第4章 if语句 45
4.1 if的基础语法 45
4.2表达式 46
4.2.1 truth 47
4.2.2布尔型 48
4.3 else语句 48
4.4 else-if 49
4.5字符串比较 49
4.6逻辑运算符在条件语句上的有趣应用 50
4.6.1逻辑非 50
4.6.2逻辑与 51
4.6.3逻辑或 51
4.6.4综合表达式 52
4.6.5逻辑表达式示例 53
4.7问答题 54
4.8实践题 54
第5章 循环 55
5.1 while循环 55
5.2 for循环 57
5.2.1变量初始化 57
5.2.2循环条件 57
5.2.3变量更新 57
5.3do-while循环 58
5.4控制循环 59
5.5嵌套循环 61
5.6选择合适的循环 62
5.6.1 for循环 62
5.6.2 while循环 62
5.6.3 do-while循环 63
5.7问答题 64
5.8实践题 64
第6章 函数 66
6.1函数语法 66
6.2局部变量和全局变量 68
6.2.1局部变量 68
6.2.2全局变量 69
6.2.3有关全局变量的警告 70
6.3使函数对调用有效 71
6.3.1函数定义和声明 71
6.3.2函数原型的应用示例 72
6.4把程序拆分成函数 73
6.4.1当需要重复代码时 73
6.4.2使代码更加易读 73
6.5命名和重载函数 73
6.6函数概述 74
6.7问答题 74
6.8实践题 75
第7章 如何解决问题 76
7.1只需判断数被除时有无余数 78
7.2效率和安全的简单说明 79
7.3不知道算法的情况下的解决方案 80
7.4实践题 82
第8章 switch-case和枚举 83
8.1比较switch-case和if-else 85
8.2使用枚举创建简单类型 86
8.3问答题 87
8.4实践题 88
第9章 随机 89
9.1获得随机数 90
9.2 bug和随机数 92
9.3问答题 92
9.4实践题 93
第二部分 数据处理 96
第10章 数组 96
10.1数组的基础语法 96
10.2数组使用示例 97
10.2.1使用数组存储排序 97
10.2.2用多维数组表示网格 98
10.3使用数组 98
10.3.1数组和for循环 98
10.3.2将数组传递给函数 99
10.3.3注销数组的末尾 101
10.4数组排序 101
10.5问答题 105
10.6实践题 106
第11章 结构体 107
11.1关联多个值 107
11.1.1语法 107
11.1.2传递结构体变量 109
11.2问答题 111
11.3实践题 112
第12章 指针简介 113
12.1忘记之前对指针的认知 113
12.2指针的概念以及关注指针的原因 113
12.3内存的概念 114
12.3.1变量与地址 115
12.3.2内存布局 116
12.4指针的其他优点(和缺点) 117
12.5问答题 118
12.6实践题 119
第13章 使用指针 120
13.1指针的语法 120
13.2指针的指向:变量的地址 121
13.3未初始化指针与空指针 125
13.4指针和函数 125
13.5引用 128
13.6问答题 129
13.7实践题 130
第14章 动态内存分配 131
14.1获得更多的新内存 131
14.1.1运行内存不足 132
14.1.2引用和动态分配 132
14.2指针和数组 132
14.3多维数组 134
14.4指针运算 135
14.4.1理解二维数组 136
14.4.2指向指针的指针 137
14.4.3指向指针的指针与二维数组 138
14.5盘点指针 139
14.6问答题 140
14.7实践题 141
第15章 数据结构简介与链表 142
15.1指针和结构体 144
15.2创建一个链表 145
15.2.1第一轮 146
15.2.2第二轮 147
15.3遍历链表 148
15.4盘点链表 150
15.5问答题 152
15.6实践题 153
第16章 递归 155
16.1如何看待递归 155
16.2递归和数据结构 157
16.3循环和递归 159
16.4栈 161
16.4.1栈的力量 163
16.4.2递归的缺点 164
16.4.3调试栈溢出 164
16.4.4性能 166
16.5盘点递归 166
16.6问答题 167
16.7实践题 167
第17章 二叉树 169
17.1在现实世界中使用二叉树 184
17.2问答题 186
17.3实践题 187
第18章 标准模板库 188
18.1 vector,大小可变的数组 189
18.1.1 vector的方法调用 190
18.1.2 vector的其他功能 190
18.2 map 191
18.3迭代器 192
18.4盘点STL 195
18.5进一步学习STL 196
18.6问答题 196
18.7实践题 197
第19章 更多关于字符串的内容 198
19.1读入字符串 198
19.2字符串长度和访问单个元素 200
19.3字符串搜索与子字符串 200
19.4通过引用传递 202
19.4.1 const传播 203
19.4.2 const和STL 204
19.5问答题 206
19.6实践题 206
第20章 使用Code::Blocks进行调试 208
20.1踏上调试之旅 209
20.2设置断点 211
20.2.1调试崩溃问题 216
20.2.2强行进入一个“悬停”程序 219
20.2.3修改变量 223
20.2.4总结 223
20.3实践题 223
20.3.1问题1:指数问题 223
20.3.2问题2:相加问题 224
20.3.3问题3:斐波那契程序的bug 225
20.3.4问题4:列表的错误读取和错误输出 225
第三部分 编写大规模程序 228
第21章 将程序分解 228
21.1理解C+++的构建过程 228
21.1.1预处理 228
21.1.2编译 230
21.1.3链接 230
21.1.4把编译和链接分开的原因 231
21.2如何把程序分开到不同的文件中 231
21.2.1第一步:将声明和定义分开 231
21.2.2第二步:找出哪些函数需要共享出去 232
21.2.3第三步:把共用的函数移到新的文件中 232
21.2.4看一个完整的例子 233
21.2.5关于头文件其他要注意的地方 237
21.2.6在开发环境中处理多个源文件 237
21.3问答题 240
21.4实践题 240
第22章 程序设计方法介绍 241
22.1冗余代码 241
22.2假定数据是如何存储的 242
22.3设计和注释 244
22.4问答题 245
第23章 隐藏结构化数据的表示 246
23.1问答题 250
23.2实践题 250
第24章类 251
24.1隐藏数据的存储方式 251
24.2声明一个类的实例 253
24.3类的职责 254
24.4小结 255
24.5问答题 255
24.6实践题 256
第25章 类的生命周期 257
25.1对象构造 257
25.1.1没有新建构造函数的结果 260
25.1.2初始化类的成员 260
25.1.3用初始化列表初始化常量字段 261
25.2解构对象 262
25.2.1 delete时的解构 264
25.2.2超出作用域时的解构 264
25.2.3由其他析构函数导致的解构 265
25.3复制类 266
25.3.1赋值操作符 267
25.3.2复制构造函数 269
25.3.3所有编译器生成的方法 270
25.3.4彻底地阻止复制 271
25.4问答题 272
25.5实践题 273
第26章 继承和多态 274
26.1C+++中的继承 275
26.1.1继承的别的作用以及误用的情况 278
26.1.2继承、对象构建和销毁 279
26.1.3多态和对象销毁 281
26.1.4对象切割的问题 283
26.1.5与子类共享代码 284
26.1.6 protected的数据 285
26.1.7属于类的数据 285
26.1.8如何实现多态 286
26.2问答题 288
26.3实践题 290
第27章 命名空间 291
27.1问答题 294
27.2实践题 295
第28章 文件I/O 296
28.1文件I/O基础 296
28.2文件格式 298
28.3写文件 301
28.4文件位置 302
28.5接受命令行参数 305
28.6二进制文件I/O 307
28.6.1处理二进制文件 309
28.6.2转换到char 309
28.6.3二进制I/O的一个例子 310
28.6.4把类存储到文件中 311
28.6.5读取二进制文件 312
28.7问答题 315
28.8实践题 315
第29章 C++中的模板 318
29.1模板函数 318
29.1.1类型推断 320
29.1.2鸭子类型 320
29.2模板类 321
29.3使用模板的一些小技巧 322
29.4模板小结 325
29.5问答题 328
29.6实践题 330
第四部分 其他 332
第30章 使用iomanip格式化输出 332
30.1处理空间问题 332
30.1.1使用setw设置字段宽度 332
30.1.2改变填充字符 333
30.1.3永久改变设置 333
30.2把你的iomanip知识汇总到一起 334
30.2.1输出数字 336
30.2.2使用setprecision来设置数值输出的精度 336
30.2.3如何处理贷币 337
30.2.4按不同的进制输出 337
第31章 异常和错误报告 338
第32章 最后的话 346
索引 368