微信扫一扫,移动浏览光盘
简介
所属分类:计算机网络 > 程序设计> c c++ c# vc vc++ >
阅读和学习本书并不要求读者有c++语言的基础,通过几百个简洁高效的代码,本书将带领读者循序渐进地领略c++语言的魅力所在。本书采用从无到有、由浅入深、逐级递进的编写方式,尤其适合无c++语言基础或c语言基础薄弱的程序员阅读。
本书共分为六篇21章,介绍了 visualc++6开发环境的搭建、c++语言的基本数据类型、c++语言的表达式、函数、函数重载、类的继承、多态、内存管理方式、文件存储、错误与异常、rtti、string类、编码风格与程序编译等内容,最后还对世界500强中it公司常见面试题进行了讲解。
本书非常适合c++语言的初、中级学者阅读,并可作为开发人员的参考手册。
前言
第一篇 c++基础
第1章 c++概述 1
1.1 了解计算机 1
1.1.1 计算机硬件 2
1.1.2 计算机软件 3
1.2 程序设计语言 3
1.2.1 机器语言 3
1.2.2 汇编语言 4
1.2.3 高级语言 5
1.2.4 数据结构和算法 6
1.2.5 面向过程的 程序设计(pop) 6
1.2.6 面向对象的 程序设计(oop) 6
1.3 c++简介 7
1.3.1 c++语言发展历程 7
1.3.2 c++语言特点 8
1.3.3 c++程序开发基本过程 8
1.4 c++开发环境的搭建 9
1.4.1 visualc++ 6开发环境简介 9
1.4.2 开发步骤 10
1.5 第一个c++程序 11
1.6 小结 12
1.7 上机实践习题 12
第2章 开始c++之旅 13
2.1 c++程序的结构 13
2.1.1 注释 14
2.1.2 编译预处理与新旧标准 14
2.1.3 主函数 14
2.1.4 名称空间 16
2.1.5 c++语素 17
2.2 变量与基本类型 18
2.2.1 变量 18
2.2.2 整型 20
2.2.3 浮点型 21
2.2.4 基本字符型 21
2.2.5 宽字符型 22
2.2.6 布尔型 22
2.3 常量 22
2.3.1 整型常量和浮点型常量 23
2.3.2 字符型常量 23
2.3.3 字符串常量 25
2.3.4 符号常量 26
2.3.5 枚举常量 27
2.4 运算符与表达式 28
2.4.1 算术运算 28
2.4.2 逻辑运算 30
2.4.3 短路表达式 30
2.4.4 关系运算 31
2.4.5 大有文章: 变量是否为“0” 31
2.4.6 条件运算 32
2.4.7 位运算 32
2.4.8 赋值运算 35
2.4.9 ++和-- 37
2.4.10 逗号表达式 38
2.4.11 sizeof运算符与sizeof表达式 38
2.4.12 运算符的优先级和结合性 38
2.5 类型转换 40
2.5.1 赋值转换 40
2.5.2 表达式中的转换 43
2.5.3 强制类型转换 44
2.5.4 函数调用和传递参数时的类型转换 45
2.6 流程控制语句 45
2.6.1 if...else...选择结构 45
2.6.2 switch结构 47
2.6.3 if...else...结构和switch结构的比较 51
2.6.4 for循环结构 51
2.6.5 for循环结构嵌套 53
2.6.6 while循环结构 54
2.6.7 do...while循环结构 54
2.6.8 循环语句的效率 55
2.6.9 流程转向控制语句之break 55
2.6.10 流程转向控制语句之continue 56
2.6.11 自由转向语句goto 56
2.6.12 程序中止函数exit() 57
2.7 小结 58
2.8 上机实践习题 58
第二篇 c++过程开发
第3章 数组和c风格字符串 61
3.1 什么是数组 61
3.2 一维数组 62
3.2.1 一维数组的声明 62
3.2.2 初始化一维数组 63
3.2.3 一维数组应用举例 64
3.2.4 数组操作注意事项 65
3.3 c 风格字符串 65
3.3.1 c 风格字符串的声明 65
3.3.2 字符数组的cin和cout 66
3.3.3 get()函数和getline()函数 67
3.3.4 cin与get()/getline()函数的搭配问题 68
3.3.5 访问c风格字符串中的某个元素 69
3.3.6 c风格字符串处理函数 69
3.4 多维数组 71
3.4.1 声明一个多维数组 71
3.4.2 初始化多维数组 72
3.4.3 多维数组应用举例 72
3.4.4 多维数组在内存中是如何排列元素的 73
3.5 小结 74
3.6 上机实践习题 74
第4章 指针和引用 76
4.1 指针的定义与使用 76
4.1.1 声明一个指针变量 76
4.1.2 初始化指针变量 79
4.1.3 指向指针的指针 80
4.1.4 指针赋值 80
4.2 指针的运算 81
4.2.1 指针与整数的加减 81
4.2.2 同类型指针间的比较 82
4.2.3 同类型指针相减 82
4.3 动态内存分配 83
4.3.1 使用new动态分配内存 83
4.3.2 使用delete动态释放及动态申请的内存 83
4.3.3 使用new申请动态数组 83
4.3.4 不要使用或释放已经释放的内存块 85
4.3.5 使用malloc和free动态申请内存 85
4.3.6 动态内存申请并不一定能成功 87
4.4 指针和const 87
4.4.1 禁止改写指针(常量指针或常指针) 87
4.4.2 禁止改写间接引用 88
4.4.3 既禁止改写指针,又禁止改写间接引用 88
4.5 指针与数组 88
4.5.1 数组名指针 88
4.5.2 数组元素的指针形式 90
4.5.3 指向数组的指针 90
4.5.4 指针数组 92
4.6 引用 95
4.6.1 引用的声明 95
4.6.2 引用的特点 95
4.6.3 引用的使用限制 96
4.6.4 其他要说明的问题 97
4.7 小结 97
4.8 上机实践习题 98
第5章 结构、共用体和链表 99
5.1 结构 99
5.1.1 如何定义一个结构 99
5.1.2 结构变量的声明和使用 100
5.1.3 结构变量的初始化 102
5.1.4 结构变量间是否可以相互赋值 102
5.1.5 结构体变量的sizeof 103
5.2 共用体 105
5.2.1 共用体的定义 105
5.2.2 共用体和结构的区别 105
5.2.3 共用体变量的声明和初始化 107
5.2.4 共用体使用举例 107
5.2.5 共用体的sizeof 109
5.3 结构数组和共用体数组 109
5.3.1 结构数组的声明和初始化 109
5.3.2 共用体数组的声明和初始化 110
5.4 指向结构的指针 111
5.4.1 声明一个结构指针 111
5.4.2 结构指针的初始化 112
5.4.3 使用指针访问结构成员 114
5.5 链表 114
5.5.1 链表的结构 115
5.5.2 创建链表 115
5.5.3 链表与数组的区别 116
5.5.4 链表的遍历和查找 116
5.5.5 链表的插入和删除 118
5.6 小结 121
5.7 上机实践习题 122
第6章 用函数合理组织程序 124
6.1 模块化带来的好处 124
6.1.1 函数的调用过程 124
6.1.2 抽象和封装 125
6.1.3 实现一个函数 126
6.2 函数定义 126
6.2.1 函数头 127
6.2.2 函数体 127
6.2.3 函数定义补充说明 128
6.3 函数声明 129
6.3.1 为什么要进行函数声明 129
6.3.2 如何声明一个函数 130
6.3.3 分割程序文件 131
6.4 函数调用 132
6.4.1 形参和实参 133
6.4.2 参数类型转换 133
6.4.3 值传递 134
6.4.4 指针传递 135
6.4.5 引用传递 136
6.4.6 对3种传递的补充 137
6.4.7 默认参数调用 138
6.4.8 inline函数 140
6.5 递归 141
6.6 函数的重载 143
6.6.1 何时使用函数重载 144
6.6.2 如何实现函数重载 144
6.6.3 陷阱:隐式转换导致重载函数出现二义性 144
6.7 c++如何使用内存 145
6.7.1 自动存储(栈存储) 145
6.7.2 静态存储(编译器预分配) 148
6.8 作用域与可见域 152
6.8.1 作用域 153
6.8.2 可见域 153
6.8.3 函数的作用域和可见域 156
6.9 小结 156
6.10 上机实践习题 157
第7章 关于函数的高级专题 158
7.1 内存使用错误剖析 158
7.1.1 内存泄露 158
7.1.2 野指针 159
7.1.3 试图修改常量 160
7.1.4 用错sizeof 161
7.1.5 内存越界访问 161
7.1.6 变量的初始化 162
7.2 重申:函数参数传递和返回机制 162
7.2.1 参数传递时的“副本” 162
7.2.2 函数返回时的“副本” 164
7.3 函数与指针 165
7.3.1 指向函数的指针 165
7.3.2 typedef 167
7.3.3 通过函数指针将函数作为另一个函数的参数 168
7.3.4 函数指针数组 169
7.3.5 返回函数指针的函数 171
7.3.6 带参主函数 171
7.4 函数与数组 172
7.4.1 数组名作为函数参数 172
7.4.2 通过指针得到多于1个的回传值 175
7.5 函数与结构体、共用体及类对象 176
7.5.1 3种参数调用 176
7.5.2 3种返回机制 177
7.6 函数编写的建议 177
7.6.1 合理使用const 177
7.6.2 检查输入参数的有效性 178
7.6.3 函数返回类型的判断 179
7.7 小结 179
7.8 上机实践习题 179
第三篇 面向对象的c++
第8章 面向对象技术基础 181
8.1 面向对象基本概念 181
8.1.1 类的概念 182
8.1.2 类是分层的 182
8.1.3 类和对象的关系 183
8.2 c++类的定义 183
8.2.1 类定义的基本形式 183
8.2.2 类定义示例 184
8.2.3 class和struct 185
8.3 c++类的实现 185
8.3.1 在类定义时定义成员函数 185
8.3.2 在类定义的外部定义成员函数 186
8.4 c++类的使用 187
8.4.1 声明一个对象 188
8.4.2 对象的作用域、可见域和生存期 189
8.5 对象的创建和撤销 189
8.5.1 构造函数的作用 189
8.5.2 构造函数可以有参数 190
8.5.3 构造函数支持重载 191
8.5.4 构造函数允许按参数默认方式调用 192
8.5.5 初始化表达式 192
8.5.6 析构函数 194
8.5.7 显式调用析构函数 195
8.6 复制构造函数 196
8.6.1 复制构造函数调用机制 196
8.6.2 默认复制构造函数带来的问题 198
8.6.3 解决方案—显式定义复制构造函数 199
8.6.4 关于构造函数和复制构造函数 201
8.7 特殊数据成员 202
8.7.1 const数据成员 202
8.7.2 引用成员 204
8.7.3 类对象成员 206
8.7.4 特别说明 210
8.7.5 static数据成员 210
8.8 特殊函数成员 212
8.8.1 静态成员函数 212
8.8.2 const与成员函数 214
8.9 对象的组织 215
8.9.1 const对象 215
8.9.2 指向对象的指针 217
8.9.3 对象的大小 218
8.9.4 this指针 219
8.9.5 对象数组 220
8.9.6 对象链表 221
8.10 为对象动态分配内存 221
8.10.1 使用new和delete为单个对象分配/释放动态内存 221
8.10.2 使用new和delete为对象数组分配/释放动态空间 222
8.10.3 malloc和free能否为对象动态申请内存 224
8.11 小结 224
8.12 上机实践习题 225
第9章 关于对象的高级专题 227
9.1 类的作用域 227
9.2 类定义的作用域与可见域 229
9.3 对象的生存期、作用域和可见域 232
9.3.1 先定义,后实例化 232
9.3.2 对象内存的释放与堆内存 232
9.4 友元 232
9.4.1 友元的非成员函数 233
9.4.2 友元的成员函数 234
9.4.3 友元函数的重载 236
9.4.4 友元类 236
9.4.5 友元是否破坏了封装性 237
9.5 运算符重载 238
9.5.1 运算符重载规则 238
9.5.2 以成员函数形式重载运算符 239
9.5.3 以友元函数形式重载运算符 242
9.5.4 友元函数形式和成员函数形式的比较 245
9.5.5 对运算符重载的补充说明 246
9.6 运算符重载范例 247
9.6.1 赋值运算符 247
9.6.2 函数调用运算符 250
9.6.3 下标运算符 251
9.7 类型转换 253
9.7.1 由其他类型向定义类的转换 253
9.7.2 由自定义类向其他类型的转换 255
9.7.3 隐式转换带来的二义性 257
9.8 重载函数选择规则 257
9.8.1 重载解析 258
9.8.2 什么是完全匹配 258
9.9 小结 259
9.10 上机实践习题 259
第10章 继承 262
10.1 什么是继承 262
10.1.1 简单示例 262
10.1.2 继承的层次性 264
10.2 派生类 264
10.2.1 public派生与private派生 264
10.2.2 protected成员与 protected派生 265
10.3 多基派生 266
10.3.1 多基派生的声明和定义 266
10.3.2 二义性问题 267
10.3.3 解决方案 268
10.4 虚基类 268
10.4.1 共同基类带来的二义性 268
10.4.2 解决方案 270
10.4.3 虚基派生二义性与多基派生二义性不同 271
10.5 派生类的构造函数和析构函数 271
10.5.1 派生类的构造函数 271
10.5.2 派生类的析构函数 273
10.5.3 多基派生类的构造函数和析构函数 275
10.5.4 虚基派生类的构造函数和析构函数 275
10.6 分清继承还是组合 278
10.6.1 继承不是万金油 278
10.6.2 组合 278
10.7 基类与派生类对象间的相互转换 280
10.7.1 类型适应 280
10.7.2 多基继承时的情况 282
10.7.3 公共基类 282
10.7.4 虚基类的情况 284
10.8 小结 284
10.9 上机实践习题 285
第11章 多态 287
11.1 多态与虚函数 287
11.1.1 静态联编 287
11.1.2 动态联编 287
11.1.3 为什么需要虚函数 287
11.1.4 虚函数的声明和定义 290
11.2 虚函数的访问 290
11.2.1 对象名访问 291
11.2.2 指针访问 292
11.2.3 引用访问 292
11.2.4 类内访问 293
11.2.5 在构造函数或析构函数中进行访问 294
11.3 纯虚函数与抽象类 295
11.3.1 纯虚函数的声明和定义 295
11.3.2 抽象类 296
11.3.3 另一种抽象类:类中只定义了 protected型的构造函数 299
11.3.4 延伸:构造函数能否为private型 301
11.3.5 虚析构函数 302
11.4 虚函数引入的二义性 305
11.4.1 多基派生 305
11.4.2 共同基类和虚继承 307
11.5 重载、覆盖与隐藏 309
11.5.1 重载 309
11.5.2 覆盖 309
11.5.3 隐藏 310
11.6 小结 311
11.7 上机实践习题 312
第四篇 泛 型 编 程
第12章 模板 315
12.1 为什么要定义模板 315
12.1.1 类型参数化 315
12.1.2 模板的定义 317
12.2 函数模板 318
12.2.1 函数模板的使用 318
12.2.2 隐式实例化 318
12.2.3 显式实例化 320
12.2.4 特化 321
12.2.5 重载 322
12.2.6 优先级与执行顺序 322
12.3 类模板 324
12.3.1 定义类模板 324
12.3.2 隐式实例化 326
12.3.3 显式实例化 326
12.3.4 显式特化 327
12.3.5 部分特化 328
12.3.6 重载和优先级 328
12.4 模板的嵌套 329
12.4.1 函数成员模板 329
12.4.2 对象成员模板 330
12.5 模板参数 331
12.6 小结 332
12.7 上机实践习题 333
第13章 标准模板库 335
13.1 理解stl 335
13.1.1 容器 335
13.1.2 适配器 336
13.1.3 迭代器 336
13.1.4 算法 336
13.2 使用序列式容器 336
13.2.1 序列式容器的创建和元素的访问 336
13.2.2 所有容器都支持的特征 338
13.2.3 序列式容器中元素的插入和删除 339
13.2.4 vector容器 344
13.2.5 deque容器 344
13.2.6 list容器 344
13.3 使用关联式容器 344
13.3.1 set容器 345
13.3.2 multiset容器 346
13.3.3 map容器 346
13.3.4 multimap容器 348
13.4 关联式容器支持的成员函数操作 349
13.4.1 元素的插入 349
13.4.2 元素的删除 352
13.4.3 元素的查找与访问 354
13.5 迭代器 355
13.5.1 理解迭代器本质 355
13.5.2 迭代器类型 355
13.5.3 为什么要定义这么多迭代器 357
13.5.4 容器中定义的迭代器类型与5种类型的对应 358
13.5.5 流迭代器 358
13.5.6 迭代器失效 360
13.6 泛型算法 360
13.6.1 什么是函数对象 360
13.6.2 算法分类 361
13.7 适配器 365
13.7.1 容器适配器 366
13.7.2 迭代器适配器 367
13.7.3 函数适配器 369
13.8 小结 371
13.9 上机实践习题 371
第五篇 输入输出处理和编程规范
第14章 输入输出和文件 373
14.1 输入输出概述 373
14.1.1 什么是文件 374
14.1.2 流 374
14.1.3 缓冲区 375
14.1.4 重定向 375
14.1.5 3种输入输出机制 376
14.2 高层i/o 377
14.2.1 标准输出函数printf 377
14.2.2 标准输入函数scanf 381
14.2.3 扫描集 384
14.2.4 sprintf函数和sscanf函数 385
14.2.5 fprintf函数和fscanf函数 386
14.2.6 文件访问机制 386
14.3 流类库 390
14.3.1 流类库更安全、更高效 390
14.3.2 流类库层次 390
14.4 输出流 394
14.4.1 操作符<< 394
14.4.2 其他ostream方法 395
14.4.3 格式状态字 397
14.4.4 格式控制值的默认值 398
14.4.5 flag函数读取和设定格式状态字 398
14.4.6 使用setf函数和unsetf函数设定格式关键字 400
14.4.7 设置域宽 402
14.4.8 填充字符 404
14.4.9 浮点数输出和显示精度 404
14.4.10 控制符 406
14.5 输入流 408
14.5.1 >>操作符 408
14.5.2 输入流与格式状态字 408
14.5.3 输入流与域宽 410
14.5.4 使用get函数读取单个字符 411
14.5.5 使用get函数和getline函数读取c风格字符串 413
14.5.6 其他istream方法 415
14.6 流状态 417
14.6.1 什么是流状态 417
14.6.2 读取流状态 417
14.6.3 管理流状态 418
14.7 重载>>和<< 420
14.7.1 插入符的重载 420
14.7.2 抽取符的重载 422
14.8 文件操作 423
14.8.1 文件操作基本过程 423
14.8.2 文件的打开 423
14.8.3 取消文件和流的关联 425
14.8.4 文件的读写 426
14.8.5 文本文件的读写 427
14.8.6 二进制文件的读写 428
14.8.7 文件定位指针和随机读取 429
14.9 字符串流 431
14.9.1 strstream类族 431
14.9.2 sstream类族 434
14.10 小结 437
14.11 上机实践习题 437
第15章 名称空间 439
15.1 什么是名称空间 439
15.1.1 名称空间范例 439
15.1.2 定义名称空间 440
15.2 实体的作用域与可见域 441
15.2.1 实体可见域 442
15.2.2 可见域的扩展 442
15.2.3 using声明机制 443
15.2.4 using声明带来的多重声明问题(二义性) 445
15.2.5 空间内的屏蔽 445
15.2.6 先声明,后使用 446
15.3 名称空间的作用域与可见性 447
15.3.1 名称空间的定义策略 447
15.3.2 推荐用法 450
15.3.3 名称空间嵌套 451
15.3.4 using编译指令 452
15.3.5 未命名的名称空间 453
15.4 对名称空间的思考 454
15.5 小结 454
15.6 上机实践习题 454
第16章 异常和错误 456
16.1 编码时的防错 456
16.1.1 调用abort函数或exit函数 456
16.1.2 返回错误标志 457
16.2 异常机制 458
16.2.1 关键字throw 460
16.2.2 异常处理程序 460
16.2.3 自定义异常对象 463
16.2.4 有继承关系的类异常 464
16.2.5 terminate函数和set_terminate函数 466
16.2.6 unexpected函数与set_unexpected函数 467
16.2.7 标准异常 468
16.2.8 对unexpected函数的补充 470
16.3 异常发生时的内存管理 471
16.3.1 堆栈解退 471
16.3.2 异常处理机制与函数的不同 472
16.3.3 构造函数中抛出异常 473
16.3.4 内存泄露 474
16.3.5 析构函数中可否抛出异常 475
16.4 auto_ptr类 476
16.4.1 使用auto_ptr类模板 477
16.4.2 关于auto_ptr的若干问题 477
16.5 小结 478
16.6 上机实践习题 479
第17章 rtti和类型转换操作符 481
17.1 rtti机制 481
17.1.1 dynamic_cast操作符 482
17.1.2 typeinfo类和typeid操作符 483
17.1.3 补充说明 484
17.2 类型转换操作符 484
17.2.1 const_cast操作符 484
17.2.2 static_cast操作符 485
17.2.3 reint erpret_cast操作符 486
17.3 小结 486
17.4 上机实践习题 487
第18章 string字符串类 489
18.1 为什么要使用string类 489
18.2 声明一个字符串 489
18.3 字符串的输入输出 491
18.4 string类功能 492
18.4.1 string字符串和c风格字符串的转换 492
18.4.2 赋值和清空 492
18.4.3 元素删除 493
18.4.4 元素追加与相加 493
18.4.5 元素插入 494
18.4.6 大小和容量 494
18.4.7 元素存取 494
18.4.8 字符串比较 495
18.4.9 提取子串 495
18.4.10 搜索与查找 495
18.5 小结 496
18.6 上机实践习题 496
第19章 编码风格 497
19.1 程序的排版 497
19.1.1 注释 497
19.1.2 空行的用法 498
19.1.3 代码行 498
19.1.4 空格 498
19.1.5 缩进与对齐 499
19.1.6 &和*的位置 499
19.2 命名规则 499
19.2.1 windows风格和unix风格 500
19.2.2 如何对程序实体命名 500
19.3 项目文件的组织 500
19.3.1 模块划分 500
19.3.2 头文件 500
19.3.3 定义文件 501
19.3.4 目录结构 501
19.4 小结 501
19.5 上机实践习题 502
第20章 程序编译 503
20.1 程序的编译流程 503
20.2 预处理 504
20.2.1 头文件包含 505
20.2.2 宏 505
20.2.3 条件编译 506
20.2.4 #ifdef、 #ifndef与重复包含 507
20.2.5 使用const代替#define定义常量 508
20.2.6 inline与#define的比较 509
20.3 vc6调试入门 509
20.3.1 断点的设置与去除 509
20.3.2 条件断点 510
20.3.3 数据断点 510
20.3.4 消息断点 511
20.3.5 观察视图(watch) 511
20.3.6 内存视图(memory) 511
20.3.7 变量视图(variables) 511
20.3.8 寄存器视图(registers) 511
20.3.9 调用堆栈视图(call stack) 512
20.3.10 反汇编视图(disassembly) 512
20.3.11 进程控制 512
20.4 其他调试手段 512
20.4.1 debug模式和release模式 512
20.4.2 assert宏 512
20.4.3 输出字符串 513
20.5 小结 513
20.6 上机实践习题 513
第六篇 面试题精选
第21章 常见面试题 517
21.1 常见基本知识问答题 517
面试题1:简述面向对象的3个基本特征 517
面试题2:局部变量能否和全局变量重名 517
面试题3:类成员函数的重载、覆盖和隐藏的区别是什么 518
面试题4:用变量a给出下面的定义 518
面试题5:在c++中,下面的结构是合法的吗?如果是,其作用是什么 519
面试题6:在非c++中建类 a 和 b,在哪几种情况下b能隐式转化为a 519
面试题7:c++中的空类,默认产生哪些类成员函数 519
面试题8:c++有哪些性质(面向对象特点) 519
面试题9:子类析构时要调用父类的析构函数吗 520
面试题10:什么是引用?声明和使用“引用”要注意哪些问题 520
面试题11:将引用作为函数返回值类型的格式及优点有哪些 520
面试题12:引用与指针的区别是什么 520
面试题13:重载和重写(覆盖)的区别 520
面试题14:多态的作用是什么 520
面试题15:请指出const与#define相比有何优点 521
面试题16:c语言中static关键字的具体作用有哪些 521
面试题17:如何判断程序是由c 编译程序还是由c++编译程序编译的 521
面试题18:关键字const的含义是什么 521
21.2 世界500强公司的智力问答题 522
面试题19:工人分金条 522
面试题20:分蛋糕 522
面试题21:过桥问题 522
面试题22:黑白帽子 523
面试题23:电梯与钻石 523
面试题24:手电筒传递 523
面试题25:烧绳问题 524
面试题26:圆的下水道盖子 524
面试题27:选建筑师 524
面试题28:天平分盐 524
面试题29:分不开的钱 524
面试题30:小鸟追火车 525
面试题31:给红色最大的机会 525
面试题32:镜子中的影像 525
面试题33:污染的药丸 525
面试题34:称出不是标准重量的水 525
面试题35:多彩的果冻 526
面试题36:电子游戏机 526
面试题37:监狱里的囚犯 526
面试题38:灯的状态 526
面试题39:时针和分针 527
面试题40:3个奇数 527
面试题41:屋内的灯 527
面试题42:找出最重的球 528
面试题43:盲人分袜子 528
面试题44:烧香计时 528
面试题45:平分蜂蜜 528
面试题46:猜经理女儿的年龄 528
面试题47:两个圆环 529
面试题48:喝啤酒 529
面试题49:算24点 529
面试题50:聪明人 529
面试题51:海盗分金币 529
面试题52:到底是什么牌 530
面试题53:聪明的老板娘 531
面试题54:找出不同重量的球 531
21.3 分析题 532
面试题55:分析下面的程序段,显示最后的结果 532
面试题56:分析程序最后的输出结果 532
面试题57:分析最后输出的结果 533
面试题58:求下面函数的返回值 533
面试题59:分析最后输出的结果 534
面试题60:分析最后输出的结果 535
21.4 编程题 536
面试题61:结果输出到文件 536
面试题62:string类的具体实现 537
面试题63:链表题,一个链表的节点结构 538
面试题64:写一个函数并找出在一个整数数组中第二大的数 540
面试题65:字符串的逆序输出 541
面试题66:判断操作系统的位数 541
面试题67:实现对数组的降序排序 542
面试题68:斐波那契数列1、1、2、3、5等,编写程序求第10项 543
·由浅入深,循序渐进,从零开始学c++,一点都不难
·编程基础、编程进阶、编程应用、项目实战、上机练习、面试指南
·266个实例、42个练习题、68个面试题
本书主要由杨彦强、刘袁红、王浩编著,其他参与编著和资料整理的人员有冯华君、刘博、刘燕、叶青、张军、张立娟、张艺、彭涛、徐磊、戎伟、朱毅、李佳、李玉涵、杨利润、杨春娇、武鹏、潘中强、王丹、王宁、王西莉、石淑珍、程彩红、邵毅、郑丹丹、郑海平、顾旭光。
作 者
2012年1月
目录
前言
第一篇 C++基础
第1章 C++概述 1
1.1 了解计算机 1
1.1.1 计算机硬件 2
1.1.2 计算机软件 3
1.2 程序设计语言 3
1.2.1 机器语言 3
1.2.2 汇编语言 4
1.2.3 高级语言 5
1.2.4 数据结构和算法 6
1.2.5 面向过程的程序设计(POP) 6
1.2.6 面向对象的程序设计(OOP) 6
1.3 C++简介 7
1.3.1 C++语言发展历程 7
1.3.2 C++语言特点 8
1.3.3 C++程序开发基本过程 8
1.4 C++开发环境的搭建 9
1.4.1 Visual C++ 6开发环境简介 9
1.4.2 开发步骤 10
1.5 第一个C++程序 11
1.6 小结 12
1.7 上机实践习题 12
第2章 开始C++之旅 13
2.1 C++程序的结构 13
2.1.1 注释 14
2.1.2 编译预处理与新旧标准 14
2.1.3 主函数 14
2.1.4 名称空间 16
2.1.5 C++语素 17
2.2 变量与基本类型 18
2.2.1 变量 18
2.2.2 整型 20
2.2.3 浮点型 21
2.2.4 基本字符型 21
2.2.5 宽字符型 22
2.2.6 布尔型 22
2.3 常量 22
2.3.1 整型常量和浮点型常量 23
2.3.2 字符型常量 23
2.3.3 字符串常量 25
2.3.4 符号常量 26
2.3.5 枚举常量 27
2.4 运算符与表达式 28
2.4.1 算术运算 28
2.4.2 逻辑运算 30
2.4.3 短路表达式 30
2.4.4 关系运算 31
2.4.5 大有文章: 变量是否为“0” 31
2.4.6 条件运算 32
2.4.7 位运算 32
2.4.8 赋值运算 35
2.4.9 ++和-- 37
2.4.10 逗号表达式 38
2.4.11 sizeof运算符与sizeof表达式 38
2.4.12 运算符的优先级和结合性 38
2.5 类型转换 40
2.5.1 赋值转换 40
2.5.2 表达式中的转换 43
2.5.3 强制类型转换 44
2.5.4 函数调用和传递参数时的类型转换 45
2.6 流程控制语句 45
2.6.1 if...else...选择结构 45
2.6.2 switch结构 47
2.6.3 if...else...结构和switch结构的比较 51
2.6.4 for循环结构 51
2.6.5 for循环结构嵌套 53
2.6.6 while循环结构 54
2.6.7 do...while循环结构 54
2.6.8 循环语句的效率 55
2.6.9 流程转向控制语句之break 55
2.6.10 流程转向控制语句之continue 56
2.6.11 自由转向语句goto 56
2.6.12 程序中止函数exit() 57
2.7 小结 58
2.8 上机实践习题 58
第二篇 C++过程开发
第3章 数组和C风格字符串 61
3.1 什么是数组 61
3.2 一维数组 62
3.2.1 一维数组的声明 62
3.2.2 初始化一维数组 63
3.2.3 一维数组应用举例 64
3.2.4 数组操作注意事项 65
3.3 C 风格字符串 65
3.3.1 C 风格字符串的声明 65
3.3.2 字符数组的cin和cout 66
3.3.3 get()函数和getline()函数 67
3.3.4 cin与get()/getline()函数的搭配问题 68
3.3.5 访问C风格字符串中的某个元素 69
3.3.6 C风格字符串处理函数 69
3.4 多维数组 71
3.4.1 声明一个多维数组 71
3.4.2 初始化多维数组 72
3.4.3 多维数组应用举例 72
3.4.4 多维数组在内存中是如何排列元素的 73
3.5 小结 74
3.6 上机实践习题 74
第4章 指针和引用 76
4.1 指针的定义与使用 76
4.1.1 声明一个指针变量 76
4.1.2 初始化指针变量 79
4.1.3 指向指针的指针 80
4.1.4 指针赋值 80
4.2 指针的运算 81
4.2.1 指针与整数的加减 81
4.2.2 同类型指针间的比较 82
4.2.3 同类型指针相减 82
4.3 动态内存分配 83
4.3.1 使用new动态分配内存 83
4.3.2 使用delete动态释放及动态申请的内存 83
4.3.3 使用new申请动态数组 83
4.3.4 不要使用或释放已经释放的内存块 85
4.3.5 使用malloc和free动态申请内存 85
4.3.6 动态内存申请并不一定能成功 87
4.4 指针和const 87
4.4.1 禁止改写指针(常量指针或常指针) 87
4.4.2 禁止改写间接引用 88
4.4.3 既禁止改写指针,又禁止改写间接引用 88
4.5 指针与数组 88
4.5.1 数组名指针 88
4.5.2 数组元素的指针形式 90
4.5.3 指向数组的指针 90
4.5.4 指针数组 92
4.6 引用 95
4.6.1 引用的声明 95
4.6.2 引用的特点 95
4.6.3 引用的使用限制 96
4.6.4 其他要说明的问题 97
4.7 小结 97
4.8 上机实践习题 98
第5章 结构、共用体和链表 99
5.1 结构 99
5.1.1 如何定义一个结构 99
5.1.2 结构变量的声明和使用 100
5.1.3 结构变量的初始化 102
5.1.4 结构变量间是否可以相互赋值 102
5.1.5 结构体变量的sizeof 103
5.2 共用体 105
5.2.1 共用体的定义 105
5.2.2 共用体和结构的区别 105
5.2.3 共用体变量的声明和初始化 107
5.2.4 共用体使用举例 107
5.2.5 共用体的sizeof 109
5.3 结构数组和共用体数组 109
5.3.1 结构数组的声明和初始化 109
5.3.2 共用体数组的声明和初始化 110
5.4 指向结构的指针 111
5.4.1 声明一个结构指针 111
5.4.2 结构指针的初始化 112
5.4.3 使用指针访问结构成员 114
5.5 链表 114
5.5.1 链表的结构 115
5.5.2 创建链表 115
5.5.3 链表与数组的区别 116
5.5.4 链表的遍历和查找 116
5.5.5 链表的插入和删除 118
5.6 小结 121
5.7 上机实践习题 122
第6章 用函数合理组织程序 124
6.1 模块化带来的好处 124
6.1.1 函数的调用过程 124
6.1.2 抽象和封装 125
6.1.3 实现一个函数 126
6.2 函数定义 126
6.2.1 函数头 127
6.2.2 函数体 127
6.2.3 函数定义补充说明 128
6.3 函数声明 129
6.3.1 为什么要进行函数声明 129
6.3.2 如何声明一个函数 130
6.3.3 分割程序文件 131
6.4 函数调用 132
6.4.1 形参和实参 133
6.4.2 参数类型转换 133
6.4.3 值传递 134
6.4.4 指针传递 135
6.4.5 引用传递 136
6.4.6 对3种传递的补充 137
6.4.7 默认参数调用 138
6.4.8 inline函数 140
6.5 递归 141
6.6 函数的重载 143
6.6.1 何时使用函数重载 144
6.6.2 如何实现函数重载 144
6.6.3 陷阱:隐式转换导致重载函数出现二义性 144
6.7 C++如何使用内存 145
6.7.1 自动存储(栈存储) 145
6.7.2 静态存储(编译器预分配) 148
6.8 作用域与可见域 152
6.8.1 作用域 153
6.8.2 可见域 153
6.8.3 函数的作用域和可见域 156
6.9 小结 156
6.10 上机实践习题 157
第7章 关于函数的高级专题 158
7.1 内存使用错误剖析 158
7.1.1 内存泄露 158
7.1.2 野指针 159
7.1.3 试图修改常量 160
7.1.4 用错sizeof 161
7.1.5 内存越界访问 161
7.1.6 变量的初始化 162
7.2 重申:函数参数传递和返回机制 162
7.2.1 参数传递时的“副本” 162
7.2.2 函数返回时的“副本” 164
7.3 函数与指针 165
7.3.1 指向函数的指针 165
7.3.2 typedef 167
7.3.3 通过函数指针将函数作为另一个函数的参数 168
7.3.4 函数指针数组 169
7.3.5 返回函数指针的函数 171
7.3.6 带参主函数 171
7.4 函数与数组 172
7.4.1 数组名作为函数参数 172
7.4.2 通过指针得到多于1个的回传值 175
7.5 函数与结构体、共用体及类对象 176
7.5.1 3种参数调用 176
7.5.2 3种返回机制 177
7.6 函数编写的建议 177
7.6.1 合理使用const 177
7.6.2 检查输入参数的有效性 178
7.6.3 函数返回类型的判断 179
7.7 小结 179
7.8 上机实践习题 179
第三篇 面向对象的C++
第8章 面向对象技术基础 181
8.1 面向对象基本概念 181
8.1.1 类的概念 182
8.1.2 类是分层的 182
8.1.3 类和对象的关系 183
8.2 C++类的定义 183
8.2.1 类定义的基本形式 183
8.2.2 类定义示例 184
8.2.3 class和struct 185
8.3 C++类的实现 185
8.3.1 在类定义时定义成员函数 185
8.3.2 在类定义的外部定义成员函数 186
8.4 C++类的使用 187
8.4.1 声明一个对象 188
8.4.2 对象的作用域、可见域和生存期 189
8.5 对象的创建和撤销 189
8.5.1 构造函数的作用 189
8.5.2 构造函数可以有参数 190
8.5.3 构造函数支持重载 191
8.5.4 构造函数允许按参数默认方式调用 192
8.5.5 初始化表达式 192
8.5.6 析构函数 194
8.5.7 显式调用析构函数 195
8.6 复制构造函数 196
8.6.1 复制构造函数调用机制 196
8.6.2 默认复制构造函数带来的问题 198
8.6.3 解决方案—显式定义复制构造函数 199
8.6.4 关于构造函数和复制构造函数 201
8.7 特殊数据成员 202
8.7.1 const数据成员 202
8.7.2 引用成员 204
8.7.3 类对象成员 206
8.7.4 特别说明 210
8.7.5 static数据成员 210
8.8 特殊函数成员 212
8.8.1 静态成员函数 212
8.8.2 const与成员函数 214
8.9 对象的组织 215
8.9.1 const对象 215
8.9.2 指向对象的指针 217
8.9.3 对象的大小 218
8.9.4 this指针 219
8.9.5 对象数组 220
8.9.6 对象链表 221
8.10 为对象动态分配内存 221
8.10.1 使用new和delete为单个对象分配/释放动态内存 221
8.10.2 使用new和delete为对象数组分配/释放动态空间 222
8.10.3 malloc和free能否为对象动态申请内存 224
8.11 小结 224
8.12 上机实践习题 225
第9章 关于对象的高级专题 227
9.1 类的作用域 227
9.2 类定义的作用域与可见域 229
9.3 对象的生存期、作用域和可见域 232
9.3.1 先定义,后实例化 232
9.3.2 对象内存的释放与堆内存 232
9.4 友元 232
9.4.1 友元的非成员函数 233
9.4.2 友元的成员函数 234
9.4.3 友元函数的重载 236
9.4.4 友元类 236
9.4.5 友元是否破坏了封装性 237
9.5 运算符重载 238
9.5.1 运算符重载规则 238
9.5.2 以成员函数形式重载运算符 239
9.5.3 以友元函数形式重载运算符 242
9.5.4 友元函数形式和成员函数形式的比较 245
9.5.5 对运算符重载的补充说明 246
9.6 运算符重载范例 247
9.6.1 赋值运算符 247
9.6.2 函数调用运算符 250
9.6.3 下标运算符 251
9.7 类型转换 253
9.7.1 由其他类型向定义类的转换 253
9.7.2 由自定义类向其他类型的转换 255
9.7.3 隐式转换带来的二义性 257
9.8 重载函数选择规则 257
9.8.1 重载解析 258
9.8.2 什么是完全匹配 258
9.9 小结 259
9.10 上机实践习题 259
第10章 继承 262
10.1 什么是继承 262
10.1.1 简单示例 262
10.1.2 继承的层次性 264
10.2 派生类 264
10.2.1 public派生与private派生 264
10.2.2 protected成员与protected派生 265
10.3 多基派生 266
10.3.1 多基派生的声明和定义 266
10.3.2 二义性问题 267
10.3.3 解决方案 268
10.4 虚基类 268
10.4.1 共同基类带来的二义性 268
10.4.2 解决方案 270
10.4.3 虚基派生二义性与多基派生二义性不同 271
10.5 派生类的构造函数和析构函数 271
10.5.1 派生类的构造函数 271
10.5.2 派生类的析构函数 273
10.5.3 多基派生类的构造函数和析构函数 275
10.5.4 虚基派生类的构造函数和析构函数 275
10.6 分清继承还是组合 278
10.6.1 继承不是万金油 278
10.6.2 组合 278
10.7 基类与派生类对象间的相互转换 280
10.7.1 类型适应 280
10.7.2 多基继承时的情况 282
10.7.3 公共基类 282
10.7.4 虚基类的情况 284
10.8 小结 284
10.9 上机实践习题 285
第11章 多态 287
11.1 多态与虚函数 287
11.1.1 静态联编 287
11.1.2 动态联编 287
11.1.3 为什么需要虚函数 287
11.1.4 虚函数的声明和定义 290
11.2 虚函数的访问 290
11.2.1 对象名访问 291
11.2.2 指针访问 292
11.2.3 引用访问 292
11.2.4 类内访问 293
11.2.5 在构造函数或析构函数中进行访问 294
11.3 纯虚函数与抽象类 295
11.3.1 纯虚函数的声明和定义 295
11.3.2 抽象类 296
11.3.3 另一种抽象类:类中只定义了protected型的构造函数 299
11.3.4 延伸:构造函数能否为private型 301
11.3.5 虚析构函数 302
11.4 虚函数引入的二义性 305
11.4.1 多基派生 305
11.4.2 共同基类和虚继承 307
11.5 重载、覆盖与隐藏 309
11.5.1 重载 309
11.5.2 覆盖 309
11.5.3 隐藏 310
11.6 小结 311
11.7 上机实践习题 312
第四篇 泛 型 编 程
第12章 模板 315
12.1 为什么要定义模板 315
12.1.1 类型参数化 315
12.1.2 模板的定义 317
12.2 函数模板 318
12.2.1 函数模板的使用 318
12.2.2 隐式实例化 318
12.2.3 显式实例化 320
12.2.4 特化 321
12.2.5 重载 322
12.2.6 优先级与执行顺序 322
12.3 类模板 324
12.3.1 定义类模板 324
12.3.2 隐式实例化 326
12.3.3 显式实例化 326
12.3.4 显式特化 327
12.3.5 部分特化 328
12.3.6 重载和优先级 328
12.4 模板的嵌套 329
12.4.1 函数成员模板 329
12.4.2 对象成员模板 330
12.5 模板参数 331
12.6 小结 332
12.7 上机实践习题 333
第13章 标准模板库 335
13.1 理解STL 335
13.1.1 容器 335
13.1.2 适配器 336
13.1.3 迭代器 336
13.1.4 算法 336
13.2 使用序列式容器 336
13.2.1 序列式容器的创建和元素的访问 336
13.2.2 所有容器都支持的特征 338
13.2.3 序列式容器中元素的插入和删除 339
13.2.4 vector容器 344
13.2.5 deque容器 344
13.2.6 list容器 344
13.3 使用关联式容器 344
13.3.1 set容器 345
13.3.2 multiset容器 346
13.3.3 map容器 346
13.3.4 multimap容器 348
13.4 关联式容器支持的成员函数操作 349
13.4.1 元素的插入 349
13.4.2 元素的删除 352
13.4.3 元素的查找与访问 354
13.5 迭代器 355
13.5.1 理解迭代器本质 355
13.5.2 迭代器类型 355
13.5.3 为什么要定义这么多迭代器 357
13.5.4 容器中定义的迭代器类型与5种类型的对应 358
13.5.5 流迭代器 358
13.5.6 迭代器失效 360
13.6 泛型算法 360
13.6.1 什么是函数对象 360
13.6.2 算法分类 361
13.7 适配器 365
13.7.1 容器适配器 366
13.7.2 迭代器适配器 367
13.7.3 函数适配器 369
13.8 小结 371
13.9 上机实践习题 371
第五篇 输入输出处理和编程规范
第14章 输入输出和文件 373
14.1 输入输出概述 373
14.1.1 什么是文件 374
14.1.2 流 374
14.1.3 缓冲区 375
14.1.4 重定向 375
14.1.5 3种输入输出机制 376
14.2 高层I/O 377
14.2.1 标准输出函数printf 377
14.2.2 标准输入函数scanf 381
14.2.3 扫描集 384
14.2.4 sprintf函数和sscanf函数 385
14.2.5 fprintf函数和fscanf函数 386
14.2.6 文件访问机制 386
14.3 流类库 390
14.3.1 流类库更安全、更高效 390
14.3.2 流类库层次 390
14.4 输出流 394
14.4.1 操作符<< 394
14.4.2 其他ostream方法 395
14.4.3 格式状态字 397
14.4.4 格式控制值的默认值 398
14.4.5 flag函数读取和设定格式状态字 398
14.4.6 使用setf函数和unsetf函数设定格式关键字 400
14.4.7 设置域宽 402
14.4.8 填充字符 404
14.4.9 浮点数输出和显示精度 404
14.4.10 控制符 406
14.5 输入流 408
14.5.1 >>操作符 408
14.5.2 输入流与格式状态字 408
14.5.3 输入流与域宽 410
14.5.4 使用get函数读取单个字符 411
14.5.5 使用get函数和getline函数读取C风格字符串 413
14.5.6 其他istream方法 415
14.6 流状态 417
14.6.1 什么是流状态 417
14.6.2 读取流状态 417
14.6.3 管理流状态 418
14.7 重载>>和<< 420
14.7.1 插入符的重载 420
14.7.2 抽取符的重载 422
14.8 文件操作 423
14.8.1 文件操作基本过程 423
14.8.2 文件的打开 423
14.8.3 取消文件和流的关联 425
14.8.4 文件的读写 426
14.8.5 文本文件的读写 427
14.8.6 二进制文件的读写 428
14.8.7 文件定位指针和随机读取 429
14.9 字符串流 431
14.9.1 strstream类族 431
14.9.2 sstream类族 434
14.10 小结 437
14.11 上机实践习题 437
第15章 名称空间 439
15.1 什么是名称空间 439
15.1.1 名称空间范例 439
15.1.2 定义名称空间 440
15.2 实体的作用域与可见域 441
15.2.1 实体可见域 442
15.2.2 可见域的扩展 442
15.2.3 using声明机制 443
15.2.4 using声明带来的多重声明问题(二义性) 445
15.2.5 空间内的屏蔽 445
15.2.6 先声明,后使用 446
15.3 名称空间的作用域与可见性 447
15.3.1 名称空间的定义策略 447
15.3.2 推荐用法 450
15.3.3 名称空间嵌套 451
15.3.4 using编译指令 452
15.3.5 未命名的名称空间 453
15.4 对名称空间的思考 454
15.5 小结 454
15.6 上机实践习题 454
第16章 异常和错误 456
16.1 编码时的防错 456
16.1.1 调用abort函数或exit函数 456
16.1.2 返回错误标志 457
16.2 异常机制 458
16.2.1 关键字throw 460
16.2.2 异常处理程序 460
16.2.3 自定义异常对象 463
16.2.4 有继承关系的类异常 464
16.2.5 terminate函数和set_terminate函数 466
16.2.6 unexpected函数与set_unexpected函数 467
16.2.7 标准异常 468
16.2.8 对unexpected函数的补充 470
16.3 异常发生时的内存管理 471
16.3.1 堆栈解退 471
16.3.2 异常处理机制与函数的不同 472
16.3.3 构造函数中抛出异常 473
16.3.4 内存泄露 474
16.3.5 析构函数中可否抛出异常 475
16.4 auto_ptr类 476
16.4.1 使用auto_ptr类模板 477
16.4.2 关于auto_ptr的若干问题 477
16.5 小结 478
16.6 上机实践习题 479
第17章 RTTI和类型转换操作符 481
17.1 RTTI机制 481
17.1.1 dynamic_cast操作符 482
17.1.2 typeinfo类和typeid操作符 483
17.1.3 补充说明 484
17.2 类型转换操作符 484
17.2.1 const_cast操作符 484
17.2.2 static_cast操作符 485
17.2.3 reinterpret_cast操作符 486
17.3 小结 486
17.4 上机实践习题 487
第18章 string字符串类 489
18.1 为什么要使用string类 489
18.2 声明一个字符串 489
18.3 字符串的输入输出 491
18.4 string类功能 492
18.4.1 string字符串和C风格字符串的转换 492
18.4.2 赋值和清空 492
18.4.3 元素删除 493
18.4.4 元素追加与相加 493
18.4.5 元素插入 494
18.4.6 大小和容量 494
18.4.7 元素存取 494
18.4.8 字符串比较 495
18.4.9 提取子串 495
18.4.10 搜索与查找 495
18.5 小结 496
18.6 上机实践习题 496
第19章 编码风格 497
19.1 程序的排版 497
19.1.1 注释 497
19.1.2 空行的用法 498
19.1.3 代码行 498
19.1.4 空格 498
19.1.5 缩进与对齐 499
19.1.6 &和*的位置 499
19.2 命名规则 499
19.2.1 Windows风格和Unix风格 500
19.2.2 如何对程序实体命名 500
19.3 项目文件的组织 500
19.3.1 模块划分 500
19.3.2 头文件 500
19.3.3 定义文件 501
19.3.4 目录结构 501
19.4 小结 501
19.5 上机实践习题 502
第20章 程序编译 503
20.1 程序的编译流程 503
20.2 预处理 504
20.2.1 头文件包含 505
20.2.2 宏 505
20.2.3 条件编译 506
20.2.4 #ifdef、 #ifndef与重复包含 507
20.2.5 使用const代替#define定义常量 508
20.2.6 inline与#define的比较 509
20.3 VC6调试入门 509
20.3.1 断点的设置与去除 509
20.3.2 条件断点 510
20.3.3 数据断点 510
20.3.4 消息断点 511
20.3.5 观察视图(Watch) 511
20.3.6 内存视图(Memory) 511
20.3.7 变量视图(Variables) 511
20.3.8 寄存器视图(Registers) 511
20.3.9 调用堆栈视图(Call Stack) 512
20.3.10 反汇编视图(Disassembly) 512
20.3.11 进程控制 512
20.4 其他调试手段 512
20.4.1 Debug模式和Release模式 512
20.4.2 assert宏 512
20.4.3 输出字符串 513
20.5 小结 513
20.6 上机实践习题 513
第六篇 面试题精选
第21章 常见面试题 517
21.1 常见基本知识问答题 517
面试题1:简述面向对象的3个基本特征 517
面试题2:局部变量能否和全局变量重名 517
面试题3:类成员函数的重载、覆盖和隐藏的区别是什么 518
面试题4:用变量a给出下面的定义 518
面试题5:在C++中,下面的结构是合法的吗?如果是,其作用是什么 519
面试题6:在非C++中建类 A 和 B,在哪几种情况下B能隐式转化为A 519
面试题7:C++中的空类,默认产生哪些类成员函数 519
面试题8:C++有哪些性质(面向对象特点) 519
面试题9:子类析构时要调用父类的析构函数吗 520
面试题10:什么是引用?声明和使用“引用”要注意哪些问题 520
面试题11:将引用作为函数返回值类型的格式及优点有哪些 520
面试题12:引用与指针的区别是什么 520
面试题13:重载和重写(覆盖)的区别 520
面试题14:多态的作用是什么 520
面试题15:请指出const与#define相比有何优点 521
面试题16:C语言中static关键字的具体作用有哪些 521
面试题17:如何判断程序是由C 编译程序还是由C++编译程序编译的 521
面试题18:关键字const的含义是什么 521
21.2 世界500强公司的智力问答题 522
面试题19:工人分金条 522
面试题20:分蛋糕 522
面试题21:过桥问题 522
面试题22:黑白帽子 523
面试题23:电梯与钻石 523
面试题24:手电筒传递 523
面试题25:烧绳问题 524
面试题26:圆的下水道盖子 524
面试题27:选建筑师 524
面试题28:天平分盐 524
面试题29:分不开的钱 524
面试题30:小鸟追火车 525
面试题31:给红色最大的机会 525
面试题32:镜子中的影像 525
面试题33:污染的药丸 525
面试题34:称出不是标准重量的水 525
面试题35:多彩的果冻 526
面试题36:电子游戏机 526
面试题37:监狱里的囚犯 526
面试题38:灯的状态 526
面试题39:时针和分针 527
面试题40:3个奇数 527
面试题41:屋内的灯 527
面试题42:找出最重的球 528
面试题43:盲人分袜子 528
面试题44:烧香计时 528
面试题45:平分蜂蜜 528
面试题46:猜经理女儿的年龄 528
面试题47:两个圆环 529
面试题48:喝啤酒 529
面试题49:算24点 529
面试题50:聪明人 529
面试题51:海盗分金币 529
面试题52:到底是什么牌 530
面试题53:聪明的老板娘 531
面试题54:找出不同重量的球 531
21.3 分析题 532
面试题55:分析下面的程序段,显示最后的结果 532
面试题56:分析程序最后的输出结果 532
面试题57:分析最后输出的结果 533
面试题58:求下面函数的返回值 533
面试题59:分析最后输出的结果 534
面试题60:分析最后输出的结果 535
21.4 编程题 536
面试题61:结果输出到文件 536
面试题62:String类的具体实现 537
面试题63:链表题,一个链表的节点结构 538
面试题64:写一个函数并找出在一个整数数组中第二大的数 540
面试题65:字符串的逆序输出 541
面试题66:判断操作系统的位数 541
面试题67:实现对数组的降序排序 542
面试题68:斐波那契数列1、1、2、3、5等,编写程序求第10项 543
第一篇 C++基础
第1章 C++概述 1
1.1 了解计算机 1
1.1.1 计算机硬件 2
1.1.2 计算机软件 3
1.2 程序设计语言 3
1.2.1 机器语言 3
1.2.2 汇编语言 4
1.2.3 高级语言 5
1.2.4 数据结构和算法 6
1.2.5 面向过程的程序设计(POP) 6
1.2.6 面向对象的程序设计(OOP) 6
1.3 C++简介 7
1.3.1 C++语言发展历程 7
1.3.2 C++语言特点 8
1.3.3 C++程序开发基本过程 8
1.4 C++开发环境的搭建 9
1.4.1 Visual C++ 6开发环境简介 9
1.4.2 开发步骤 10
1.5 第一个C++程序 11
1.6 小结 12
1.7 上机实践习题 12
第2章 开始C++之旅 13
2.1 C++程序的结构 13
2.1.1 注释 14
2.1.2 编译预处理与新旧标准 14
2.1.3 主函数 14
2.1.4 名称空间 16
2.1.5 C++语素 17
2.2 变量与基本类型 18
2.2.1 变量 18
2.2.2 整型 20
2.2.3 浮点型 21
2.2.4 基本字符型 21
2.2.5 宽字符型 22
2.2.6 布尔型 22
2.3 常量 22
2.3.1 整型常量和浮点型常量 23
2.3.2 字符型常量 23
2.3.3 字符串常量 25
2.3.4 符号常量 26
2.3.5 枚举常量 27
2.4 运算符与表达式 28
2.4.1 算术运算 28
2.4.2 逻辑运算 30
2.4.3 短路表达式 30
2.4.4 关系运算 31
2.4.5 大有文章: 变量是否为“0” 31
2.4.6 条件运算 32
2.4.7 位运算 32
2.4.8 赋值运算 35
2.4.9 ++和-- 37
2.4.10 逗号表达式 38
2.4.11 sizeof运算符与sizeof表达式 38
2.4.12 运算符的优先级和结合性 38
2.5 类型转换 40
2.5.1 赋值转换 40
2.5.2 表达式中的转换 43
2.5.3 强制类型转换 44
2.5.4 函数调用和传递参数时的类型转换 45
2.6 流程控制语句 45
2.6.1 if...else...选择结构 45
2.6.2 switch结构 47
2.6.3 if...else...结构和switch结构的比较 51
2.6.4 for循环结构 51
2.6.5 for循环结构嵌套 53
2.6.6 while循环结构 54
2.6.7 do...while循环结构 54
2.6.8 循环语句的效率 55
2.6.9 流程转向控制语句之break 55
2.6.10 流程转向控制语句之continue 56
2.6.11 自由转向语句goto 56
2.6.12 程序中止函数exit() 57
2.7 小结 58
2.8 上机实践习题 58
第二篇 C++过程开发
第3章 数组和C风格字符串 61
3.1 什么是数组 61
3.2 一维数组 62
3.2.1 一维数组的声明 62
3.2.2 初始化一维数组 63
3.2.3 一维数组应用举例 64
3.2.4 数组操作注意事项 65
3.3 C 风格字符串 65
3.3.1 C 风格字符串的声明 65
3.3.2 字符数组的cin和cout 66
3.3.3 get()函数和getline()函数 67
3.3.4 cin与get()/getline()函数的搭配问题 68
3.3.5 访问C风格字符串中的某个元素 69
3.3.6 C风格字符串处理函数 69
3.4 多维数组 71
3.4.1 声明一个多维数组 71
3.4.2 初始化多维数组 72
3.4.3 多维数组应用举例 72
3.4.4 多维数组在内存中是如何排列元素的 73
3.5 小结 74
3.6 上机实践习题 74
第4章 指针和引用 76
4.1 指针的定义与使用 76
4.1.1 声明一个指针变量 76
4.1.2 初始化指针变量 79
4.1.3 指向指针的指针 80
4.1.4 指针赋值 80
4.2 指针的运算 81
4.2.1 指针与整数的加减 81
4.2.2 同类型指针间的比较 82
4.2.3 同类型指针相减 82
4.3 动态内存分配 83
4.3.1 使用new动态分配内存 83
4.3.2 使用delete动态释放及动态申请的内存 83
4.3.3 使用new申请动态数组 83
4.3.4 不要使用或释放已经释放的内存块 85
4.3.5 使用malloc和free动态申请内存 85
4.3.6 动态内存申请并不一定能成功 87
4.4 指针和const 87
4.4.1 禁止改写指针(常量指针或常指针) 87
4.4.2 禁止改写间接引用 88
4.4.3 既禁止改写指针,又禁止改写间接引用 88
4.5 指针与数组 88
4.5.1 数组名指针 88
4.5.2 数组元素的指针形式 90
4.5.3 指向数组的指针 90
4.5.4 指针数组 92
4.6 引用 95
4.6.1 引用的声明 95
4.6.2 引用的特点 95
4.6.3 引用的使用限制 96
4.6.4 其他要说明的问题 97
4.7 小结 97
4.8 上机实践习题 98
第5章 结构、共用体和链表 99
5.1 结构 99
5.1.1 如何定义一个结构 99
5.1.2 结构变量的声明和使用 100
5.1.3 结构变量的初始化 102
5.1.4 结构变量间是否可以相互赋值 102
5.1.5 结构体变量的sizeof 103
5.2 共用体 105
5.2.1 共用体的定义 105
5.2.2 共用体和结构的区别 105
5.2.3 共用体变量的声明和初始化 107
5.2.4 共用体使用举例 107
5.2.5 共用体的sizeof 109
5.3 结构数组和共用体数组 109
5.3.1 结构数组的声明和初始化 109
5.3.2 共用体数组的声明和初始化 110
5.4 指向结构的指针 111
5.4.1 声明一个结构指针 111
5.4.2 结构指针的初始化 112
5.4.3 使用指针访问结构成员 114
5.5 链表 114
5.5.1 链表的结构 115
5.5.2 创建链表 115
5.5.3 链表与数组的区别 116
5.5.4 链表的遍历和查找 116
5.5.5 链表的插入和删除 118
5.6 小结 121
5.7 上机实践习题 122
第6章 用函数合理组织程序 124
6.1 模块化带来的好处 124
6.1.1 函数的调用过程 124
6.1.2 抽象和封装 125
6.1.3 实现一个函数 126
6.2 函数定义 126
6.2.1 函数头 127
6.2.2 函数体 127
6.2.3 函数定义补充说明 128
6.3 函数声明 129
6.3.1 为什么要进行函数声明 129
6.3.2 如何声明一个函数 130
6.3.3 分割程序文件 131
6.4 函数调用 132
6.4.1 形参和实参 133
6.4.2 参数类型转换 133
6.4.3 值传递 134
6.4.4 指针传递 135
6.4.5 引用传递 136
6.4.6 对3种传递的补充 137
6.4.7 默认参数调用 138
6.4.8 inline函数 140
6.5 递归 141
6.6 函数的重载 143
6.6.1 何时使用函数重载 144
6.6.2 如何实现函数重载 144
6.6.3 陷阱:隐式转换导致重载函数出现二义性 144
6.7 C++如何使用内存 145
6.7.1 自动存储(栈存储) 145
6.7.2 静态存储(编译器预分配) 148
6.8 作用域与可见域 152
6.8.1 作用域 153
6.8.2 可见域 153
6.8.3 函数的作用域和可见域 156
6.9 小结 156
6.10 上机实践习题 157
第7章 关于函数的高级专题 158
7.1 内存使用错误剖析 158
7.1.1 内存泄露 158
7.1.2 野指针 159
7.1.3 试图修改常量 160
7.1.4 用错sizeof 161
7.1.5 内存越界访问 161
7.1.6 变量的初始化 162
7.2 重申:函数参数传递和返回机制 162
7.2.1 参数传递时的“副本” 162
7.2.2 函数返回时的“副本” 164
7.3 函数与指针 165
7.3.1 指向函数的指针 165
7.3.2 typedef 167
7.3.3 通过函数指针将函数作为另一个函数的参数 168
7.3.4 函数指针数组 169
7.3.5 返回函数指针的函数 171
7.3.6 带参主函数 171
7.4 函数与数组 172
7.4.1 数组名作为函数参数 172
7.4.2 通过指针得到多于1个的回传值 175
7.5 函数与结构体、共用体及类对象 176
7.5.1 3种参数调用 176
7.5.2 3种返回机制 177
7.6 函数编写的建议 177
7.6.1 合理使用const 177
7.6.2 检查输入参数的有效性 178
7.6.3 函数返回类型的判断 179
7.7 小结 179
7.8 上机实践习题 179
第三篇 面向对象的C++
第8章 面向对象技术基础 181
8.1 面向对象基本概念 181
8.1.1 类的概念 182
8.1.2 类是分层的 182
8.1.3 类和对象的关系 183
8.2 C++类的定义 183
8.2.1 类定义的基本形式 183
8.2.2 类定义示例 184
8.2.3 class和struct 185
8.3 C++类的实现 185
8.3.1 在类定义时定义成员函数 185
8.3.2 在类定义的外部定义成员函数 186
8.4 C++类的使用 187
8.4.1 声明一个对象 188
8.4.2 对象的作用域、可见域和生存期 189
8.5 对象的创建和撤销 189
8.5.1 构造函数的作用 189
8.5.2 构造函数可以有参数 190
8.5.3 构造函数支持重载 191
8.5.4 构造函数允许按参数默认方式调用 192
8.5.5 初始化表达式 192
8.5.6 析构函数 194
8.5.7 显式调用析构函数 195
8.6 复制构造函数 196
8.6.1 复制构造函数调用机制 196
8.6.2 默认复制构造函数带来的问题 198
8.6.3 解决方案—显式定义复制构造函数 199
8.6.4 关于构造函数和复制构造函数 201
8.7 特殊数据成员 202
8.7.1 const数据成员 202
8.7.2 引用成员 204
8.7.3 类对象成员 206
8.7.4 特别说明 210
8.7.5 static数据成员 210
8.8 特殊函数成员 212
8.8.1 静态成员函数 212
8.8.2 const与成员函数 214
8.9 对象的组织 215
8.9.1 const对象 215
8.9.2 指向对象的指针 217
8.9.3 对象的大小 218
8.9.4 this指针 219
8.9.5 对象数组 220
8.9.6 对象链表 221
8.10 为对象动态分配内存 221
8.10.1 使用new和delete为单个对象分配/释放动态内存 221
8.10.2 使用new和delete为对象数组分配/释放动态空间 222
8.10.3 malloc和free能否为对象动态申请内存 224
8.11 小结 224
8.12 上机实践习题 225
第9章 关于对象的高级专题 227
9.1 类的作用域 227
9.2 类定义的作用域与可见域 229
9.3 对象的生存期、作用域和可见域 232
9.3.1 先定义,后实例化 232
9.3.2 对象内存的释放与堆内存 232
9.4 友元 232
9.4.1 友元的非成员函数 233
9.4.2 友元的成员函数 234
9.4.3 友元函数的重载 236
9.4.4 友元类 236
9.4.5 友元是否破坏了封装性 237
9.5 运算符重载 238
9.5.1 运算符重载规则 238
9.5.2 以成员函数形式重载运算符 239
9.5.3 以友元函数形式重载运算符 242
9.5.4 友元函数形式和成员函数形式的比较 245
9.5.5 对运算符重载的补充说明 246
9.6 运算符重载范例 247
9.6.1 赋值运算符 247
9.6.2 函数调用运算符 250
9.6.3 下标运算符 251
9.7 类型转换 253
9.7.1 由其他类型向定义类的转换 253
9.7.2 由自定义类向其他类型的转换 255
9.7.3 隐式转换带来的二义性 257
9.8 重载函数选择规则 257
9.8.1 重载解析 258
9.8.2 什么是完全匹配 258
9.9 小结 259
9.10 上机实践习题 259
第10章 继承 262
10.1 什么是继承 262
10.1.1 简单示例 262
10.1.2 继承的层次性 264
10.2 派生类 264
10.2.1 public派生与private派生 264
10.2.2 protected成员与protected派生 265
10.3 多基派生 266
10.3.1 多基派生的声明和定义 266
10.3.2 二义性问题 267
10.3.3 解决方案 268
10.4 虚基类 268
10.4.1 共同基类带来的二义性 268
10.4.2 解决方案 270
10.4.3 虚基派生二义性与多基派生二义性不同 271
10.5 派生类的构造函数和析构函数 271
10.5.1 派生类的构造函数 271
10.5.2 派生类的析构函数 273
10.5.3 多基派生类的构造函数和析构函数 275
10.5.4 虚基派生类的构造函数和析构函数 275
10.6 分清继承还是组合 278
10.6.1 继承不是万金油 278
10.6.2 组合 278
10.7 基类与派生类对象间的相互转换 280
10.7.1 类型适应 280
10.7.2 多基继承时的情况 282
10.7.3 公共基类 282
10.7.4 虚基类的情况 284
10.8 小结 284
10.9 上机实践习题 285
第11章 多态 287
11.1 多态与虚函数 287
11.1.1 静态联编 287
11.1.2 动态联编 287
11.1.3 为什么需要虚函数 287
11.1.4 虚函数的声明和定义 290
11.2 虚函数的访问 290
11.2.1 对象名访问 291
11.2.2 指针访问 292
11.2.3 引用访问 292
11.2.4 类内访问 293
11.2.5 在构造函数或析构函数中进行访问 294
11.3 纯虚函数与抽象类 295
11.3.1 纯虚函数的声明和定义 295
11.3.2 抽象类 296
11.3.3 另一种抽象类:类中只定义了protected型的构造函数 299
11.3.4 延伸:构造函数能否为private型 301
11.3.5 虚析构函数 302
11.4 虚函数引入的二义性 305
11.4.1 多基派生 305
11.4.2 共同基类和虚继承 307
11.5 重载、覆盖与隐藏 309
11.5.1 重载 309
11.5.2 覆盖 309
11.5.3 隐藏 310
11.6 小结 311
11.7 上机实践习题 312
第四篇 泛 型 编 程
第12章 模板 315
12.1 为什么要定义模板 315
12.1.1 类型参数化 315
12.1.2 模板的定义 317
12.2 函数模板 318
12.2.1 函数模板的使用 318
12.2.2 隐式实例化 318
12.2.3 显式实例化 320
12.2.4 特化 321
12.2.5 重载 322
12.2.6 优先级与执行顺序 322
12.3 类模板 324
12.3.1 定义类模板 324
12.3.2 隐式实例化 326
12.3.3 显式实例化 326
12.3.4 显式特化 327
12.3.5 部分特化 328
12.3.6 重载和优先级 328
12.4 模板的嵌套 329
12.4.1 函数成员模板 329
12.4.2 对象成员模板 330
12.5 模板参数 331
12.6 小结 332
12.7 上机实践习题 333
第13章 标准模板库 335
13.1 理解STL 335
13.1.1 容器 335
13.1.2 适配器 336
13.1.3 迭代器 336
13.1.4 算法 336
13.2 使用序列式容器 336
13.2.1 序列式容器的创建和元素的访问 336
13.2.2 所有容器都支持的特征 338
13.2.3 序列式容器中元素的插入和删除 339
13.2.4 vector容器 344
13.2.5 deque容器 344
13.2.6 list容器 344
13.3 使用关联式容器 344
13.3.1 set容器 345
13.3.2 multiset容器 346
13.3.3 map容器 346
13.3.4 multimap容器 348
13.4 关联式容器支持的成员函数操作 349
13.4.1 元素的插入 349
13.4.2 元素的删除 352
13.4.3 元素的查找与访问 354
13.5 迭代器 355
13.5.1 理解迭代器本质 355
13.5.2 迭代器类型 355
13.5.3 为什么要定义这么多迭代器 357
13.5.4 容器中定义的迭代器类型与5种类型的对应 358
13.5.5 流迭代器 358
13.5.6 迭代器失效 360
13.6 泛型算法 360
13.6.1 什么是函数对象 360
13.6.2 算法分类 361
13.7 适配器 365
13.7.1 容器适配器 366
13.7.2 迭代器适配器 367
13.7.3 函数适配器 369
13.8 小结 371
13.9 上机实践习题 371
第五篇 输入输出处理和编程规范
第14章 输入输出和文件 373
14.1 输入输出概述 373
14.1.1 什么是文件 374
14.1.2 流 374
14.1.3 缓冲区 375
14.1.4 重定向 375
14.1.5 3种输入输出机制 376
14.2 高层I/O 377
14.2.1 标准输出函数printf 377
14.2.2 标准输入函数scanf 381
14.2.3 扫描集 384
14.2.4 sprintf函数和sscanf函数 385
14.2.5 fprintf函数和fscanf函数 386
14.2.6 文件访问机制 386
14.3 流类库 390
14.3.1 流类库更安全、更高效 390
14.3.2 流类库层次 390
14.4 输出流 394
14.4.1 操作符<< 394
14.4.2 其他ostream方法 395
14.4.3 格式状态字 397
14.4.4 格式控制值的默认值 398
14.4.5 flag函数读取和设定格式状态字 398
14.4.6 使用setf函数和unsetf函数设定格式关键字 400
14.4.7 设置域宽 402
14.4.8 填充字符 404
14.4.9 浮点数输出和显示精度 404
14.4.10 控制符 406
14.5 输入流 408
14.5.1 >>操作符 408
14.5.2 输入流与格式状态字 408
14.5.3 输入流与域宽 410
14.5.4 使用get函数读取单个字符 411
14.5.5 使用get函数和getline函数读取C风格字符串 413
14.5.6 其他istream方法 415
14.6 流状态 417
14.6.1 什么是流状态 417
14.6.2 读取流状态 417
14.6.3 管理流状态 418
14.7 重载>>和<< 420
14.7.1 插入符的重载 420
14.7.2 抽取符的重载 422
14.8 文件操作 423
14.8.1 文件操作基本过程 423
14.8.2 文件的打开 423
14.8.3 取消文件和流的关联 425
14.8.4 文件的读写 426
14.8.5 文本文件的读写 427
14.8.6 二进制文件的读写 428
14.8.7 文件定位指针和随机读取 429
14.9 字符串流 431
14.9.1 strstream类族 431
14.9.2 sstream类族 434
14.10 小结 437
14.11 上机实践习题 437
第15章 名称空间 439
15.1 什么是名称空间 439
15.1.1 名称空间范例 439
15.1.2 定义名称空间 440
15.2 实体的作用域与可见域 441
15.2.1 实体可见域 442
15.2.2 可见域的扩展 442
15.2.3 using声明机制 443
15.2.4 using声明带来的多重声明问题(二义性) 445
15.2.5 空间内的屏蔽 445
15.2.6 先声明,后使用 446
15.3 名称空间的作用域与可见性 447
15.3.1 名称空间的定义策略 447
15.3.2 推荐用法 450
15.3.3 名称空间嵌套 451
15.3.4 using编译指令 452
15.3.5 未命名的名称空间 453
15.4 对名称空间的思考 454
15.5 小结 454
15.6 上机实践习题 454
第16章 异常和错误 456
16.1 编码时的防错 456
16.1.1 调用abort函数或exit函数 456
16.1.2 返回错误标志 457
16.2 异常机制 458
16.2.1 关键字throw 460
16.2.2 异常处理程序 460
16.2.3 自定义异常对象 463
16.2.4 有继承关系的类异常 464
16.2.5 terminate函数和set_terminate函数 466
16.2.6 unexpected函数与set_unexpected函数 467
16.2.7 标准异常 468
16.2.8 对unexpected函数的补充 470
16.3 异常发生时的内存管理 471
16.3.1 堆栈解退 471
16.3.2 异常处理机制与函数的不同 472
16.3.3 构造函数中抛出异常 473
16.3.4 内存泄露 474
16.3.5 析构函数中可否抛出异常 475
16.4 auto_ptr类 476
16.4.1 使用auto_ptr类模板 477
16.4.2 关于auto_ptr的若干问题 477
16.5 小结 478
16.6 上机实践习题 479
第17章 RTTI和类型转换操作符 481
17.1 RTTI机制 481
17.1.1 dynamic_cast操作符 482
17.1.2 typeinfo类和typeid操作符 483
17.1.3 补充说明 484
17.2 类型转换操作符 484
17.2.1 const_cast操作符 484
17.2.2 static_cast操作符 485
17.2.3 reinterpret_cast操作符 486
17.3 小结 486
17.4 上机实践习题 487
第18章 string字符串类 489
18.1 为什么要使用string类 489
18.2 声明一个字符串 489
18.3 字符串的输入输出 491
18.4 string类功能 492
18.4.1 string字符串和C风格字符串的转换 492
18.4.2 赋值和清空 492
18.4.3 元素删除 493
18.4.4 元素追加与相加 493
18.4.5 元素插入 494
18.4.6 大小和容量 494
18.4.7 元素存取 494
18.4.8 字符串比较 495
18.4.9 提取子串 495
18.4.10 搜索与查找 495
18.5 小结 496
18.6 上机实践习题 496
第19章 编码风格 497
19.1 程序的排版 497
19.1.1 注释 497
19.1.2 空行的用法 498
19.1.3 代码行 498
19.1.4 空格 498
19.1.5 缩进与对齐 499
19.1.6 &和*的位置 499
19.2 命名规则 499
19.2.1 Windows风格和Unix风格 500
19.2.2 如何对程序实体命名 500
19.3 项目文件的组织 500
19.3.1 模块划分 500
19.3.2 头文件 500
19.3.3 定义文件 501
19.3.4 目录结构 501
19.4 小结 501
19.5 上机实践习题 502
第20章 程序编译 503
20.1 程序的编译流程 503
20.2 预处理 504
20.2.1 头文件包含 505
20.2.2 宏 505
20.2.3 条件编译 506
20.2.4 #ifdef、 #ifndef与重复包含 507
20.2.5 使用const代替#define定义常量 508
20.2.6 inline与#define的比较 509
20.3 VC6调试入门 509
20.3.1 断点的设置与去除 509
20.3.2 条件断点 510
20.3.3 数据断点 510
20.3.4 消息断点 511
20.3.5 观察视图(Watch) 511
20.3.6 内存视图(Memory) 511
20.3.7 变量视图(Variables) 511
20.3.8 寄存器视图(Registers) 511
20.3.9 调用堆栈视图(Call Stack) 512
20.3.10 反汇编视图(Disassembly) 512
20.3.11 进程控制 512
20.4 其他调试手段 512
20.4.1 Debug模式和Release模式 512
20.4.2 assert宏 512
20.4.3 输出字符串 513
20.5 小结 513
20.6 上机实践习题 513
第六篇 面试题精选
第21章 常见面试题 517
21.1 常见基本知识问答题 517
面试题1:简述面向对象的3个基本特征 517
面试题2:局部变量能否和全局变量重名 517
面试题3:类成员函数的重载、覆盖和隐藏的区别是什么 518
面试题4:用变量a给出下面的定义 518
面试题5:在C++中,下面的结构是合法的吗?如果是,其作用是什么 519
面试题6:在非C++中建类 A 和 B,在哪几种情况下B能隐式转化为A 519
面试题7:C++中的空类,默认产生哪些类成员函数 519
面试题8:C++有哪些性质(面向对象特点) 519
面试题9:子类析构时要调用父类的析构函数吗 520
面试题10:什么是引用?声明和使用“引用”要注意哪些问题 520
面试题11:将引用作为函数返回值类型的格式及优点有哪些 520
面试题12:引用与指针的区别是什么 520
面试题13:重载和重写(覆盖)的区别 520
面试题14:多态的作用是什么 520
面试题15:请指出const与#define相比有何优点 521
面试题16:C语言中static关键字的具体作用有哪些 521
面试题17:如何判断程序是由C 编译程序还是由C++编译程序编译的 521
面试题18:关键字const的含义是什么 521
21.2 世界500强公司的智力问答题 522
面试题19:工人分金条 522
面试题20:分蛋糕 522
面试题21:过桥问题 522
面试题22:黑白帽子 523
面试题23:电梯与钻石 523
面试题24:手电筒传递 523
面试题25:烧绳问题 524
面试题26:圆的下水道盖子 524
面试题27:选建筑师 524
面试题28:天平分盐 524
面试题29:分不开的钱 524
面试题30:小鸟追火车 525
面试题31:给红色最大的机会 525
面试题32:镜子中的影像 525
面试题33:污染的药丸 525
面试题34:称出不是标准重量的水 525
面试题35:多彩的果冻 526
面试题36:电子游戏机 526
面试题37:监狱里的囚犯 526
面试题38:灯的状态 526
面试题39:时针和分针 527
面试题40:3个奇数 527
面试题41:屋内的灯 527
面试题42:找出最重的球 528
面试题43:盲人分袜子 528
面试题44:烧香计时 528
面试题45:平分蜂蜜 528
面试题46:猜经理女儿的年龄 528
面试题47:两个圆环 529
面试题48:喝啤酒 529
面试题49:算24点 529
面试题50:聪明人 529
面试题51:海盗分金币 529
面试题52:到底是什么牌 530
面试题53:聪明的老板娘 531
面试题54:找出不同重量的球 531
21.3 分析题 532
面试题55:分析下面的程序段,显示最后的结果 532
面试题56:分析程序最后的输出结果 532
面试题57:分析最后输出的结果 533
面试题58:求下面函数的返回值 533
面试题59:分析最后输出的结果 534
面试题60:分析最后输出的结果 535
21.4 编程题 536
面试题61:结果输出到文件 536
面试题62:String类的具体实现 537
面试题63:链表题,一个链表的节点结构 538
面试题64:写一个函数并找出在一个整数数组中第二大的数 540
面试题65:字符串的逆序输出 541
面试题66:判断操作系统的位数 541
面试题67:实现对数组的降序排序 542
面试题68:斐波那契数列1、1、2、3、5等,编写程序求第10项 543
零基础学C++
光盘服务联系方式: 020-38250260 客服QQ:4006604884
云图客服:
用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问
Video Player
×
Audio Player
×
pdf Player
×
亲爱的云图用户,
光盘内的文件都可以直接点击浏览哦
无需下载,在线查阅资料!