《C++面向对象程序设计》PDF下载

  • 购买积分:20 如何计算积分?
  • 作  者:周靖编著
  • 出 版 社:北京:清华大学出版社
  • 出版年份:2010
  • ISBN:9787302215301
  • 页数:718 页
图书介绍:本书作为最优秀的C++入门教材之一,在全球已经拥有数十万读者,国内也被各高校广泛采用。全书共18章,8个附录。在讲解C++基础知识之后,循序渐进地引导学生深入函数、I/O流、类、控制流程、命名空间等等。

第1章 计算机和C++编程入门 1

概述 2

1.1 计算机系统 2

1.1.1 硬件 2

1.1.2 软件 5

1.1.3 高级语言 6

1.1.4 编译器 7

1.1.5 历史回顾 9

1.2 编程和问题求解 10

1.2.1 算法 10

1.2.2 程序设计 11

1.2.3 面向对象编程 12

1.2.4 软件的生命周期 13

1.3 C++入门 14

1.3.1 C++语言的起源 14

1.3.2 一个C++示范程序 15

1.3.3 陷阱:在\n中错误地使用斜杠 17

1.3.4 编程提示:输入和输出语法 17

1.3.5 简单C++程序的布局 18

1.3.6 陷阱:在include的文件名前错误地添加一个空格 19

1.3.7 编译和运行C++程序 20

1.3.8 编程提示:让程序运行起来 20

1.4 测试和调试 23

1.4.1 程序错误的分类 23

1.4.2 陷阱:错误地假定程序正确 24

小结 25

自测题答案 25

编程项目 26

第2章 C++基础知识 29

概述 30

预备知识 30

2.1 变量和赋值 30

2.1.1 变量 30

2.1.2 名称:标识符 32

2.1.3 变量声明 33

2.1.4 赋值语句 34

2.1.5 陷阱:未初始化的变量 35

2.1.6 编程提示:使用有意义的名称 36

2.2 输入和输出 37

2.2.1 使用cout进行输出 37

2.2.2 include预编译指令和命名空间 38

2.2.3 转义序列 39

2.2.4 编程提示:用\n或endl终止每一个程序 40

2.2.5 格式化带小数点的数字 41

2.2.6 用cin进行输入 42

2.2.7 设计输入和输出 43

2.2.8 编程提示:I/O中的换行 43

2.3 数据类型和表达式 45

2.3.1 int类型和double类型 45

2.3.2 其他数字类型 46

2.3.3 char类型 47

2.3.4 bool类型 48

2.3.5 string类简介 48

2.3.6 类型的兼容性 50

2.3.7 算术操作符和表达式 51

2.3.8 陷阱:除法中的整数 53

2.3.9 更多赋值语句 54

2.4 简单控制流程 55

2.4.1 一个简单的分支机制 55

2.4.2 陷阱:连续的不等式 59

2.4.3 陷阱:在该用==的时候错用了= 59

2.4.4 复合语句 60

2.4.5 简单的循环机制 62

2.4.6 递增操作符和递减操作符 65

2.4.7 编程实例:信用卡余额 65

2.4.8 陷阱:无限循环 66

2.5 程序风格 69

2.5.1 缩进 69

2.5.2 注释 69

2.5.3 为常量命名 71

小结 73

自测题答案 73

编程项目 76

第3章 更多的控制流程 81

概述 82

预备知识 82

3.1 使用布尔表达式 82

3.1.1 布尔表达式求值 82

3.1.2 陷阱:将布尔表达式转换成int值 85

3.1.3 枚举类型(选读) 87

3.2 多路分支 88

3.2.1 嵌套语句 88

3.2.2 编程提示:在嵌套语句中使用花括号 88

3.2.3 多路if-else语句 90

3.2.4 编程实例:州收入税 92

3.2.5 switch语句 94

3.2.6 陷阱:忘记在switch语句中添加break 97

3.2.7 为菜单使用switch语句 97

3.2.8 语句块 98

3.2.9 陷阱:疏忽局部变量 100

3.3 C++循环语句详解 102

3.3.1 while语句回顾 102

3.3.2 再论递增操作符和递减操作符 103

3.3.3 for语句 105

3.3.4 陷阱:for语句中多余的分号 109

3.3.5 应该使用哪种循环 109

3.3.6 陷阱:未初始化的变量和无限循环 111

3.3.7 break语句 111

3.3.8 陷阱:嵌套循环中的break语句 112

3.4 设计循环 113

3.4.1 求和与求乘积的循环 113

3.4.2 终止循环 114

3.4.3 嵌套循环 116

3.4.4 调试循环 118

小结 121

自测题答案 121

编程项目 125

第4章 过程抽象和返回一个值的函数 129

概述 130

预备知识 130

4.1 自顶向下设计 130

4.2 预定义函数 130

4.2.1 使用预定义函数 131

4.2.2 强制类型转换 134

4.2.3 强制类型转换的古老形式 136

4.2.4 陷阱:整数除法丢弃了小数部分 136

4.3 程序员自定义函数 138

4.3.1 函数定义 138

4.3.2 能返回布尔值的函数 142

4.3.3 另一种形式的函数声明 142

4.3.4 陷阱:实参顺序错误 143

4.3.5 函数定义语法总结 144

4.3.6 再论函数定义的位置 144

4.3.7 编程提示:在分支语句中使用函数调用 145

4.4 过程抽象 146

4.4.1 黑盒的比喻 146

4.4.2 编程提示:选择形参名称 147

4.4.3 编程提示:嵌套循环 148

4.4.4 案例分析:购买比萨 150

4.4.5 编程提示:使用伪代码 155

4.5 局部变量 156

4.5.1 函数如同小程序 156

4.5.2 编程实例:豌豆试验田 158

4.5.3 全局常量和全局变量 158

4.5.4 传值调用形参是局部变量 160

4.5.5 再论命名空间 161

4.5.6 编程实例:阶乘函数 163

4.6 重载函数名称 165

4.6.1 重载入门 165

4.6.2 编程实例;购买比萨(修订版) 167

4.6.3 自动类型转换 169

小结 171

自测题答案 171

编程项目 174

第5章 所有子任务的函数 177

概述 178

预备知识 178

5.1 void函数 178

5.1.1 void函数的定义 178

5.1.2 编程实例:温度换算 180

5.1.3 void函数中的return语句 181

5.2 传引用调用形参 183

5.2.1 初探传引用调用 183

5.2.2 传引用调用详解 185

5.2.3 编程实例:swap_values函数 187

5.2.4 混合的参数列表 188

5.2.5 编程提示:应该使用哪种参数 189

5.2.6 陷阱:疏忽造成的局部变量 190

5.3 使用过程抽象 192

5.3.1 由函数来调用函数 192

5.3.2 前条件和后条件 193

5.3.3 案例分析:超市定价系统 194

5.4 测试和调试函数 199

5.5 常规调试技术 203

5.5.1 不抱成见 203

5.5.2 检查常见错误 203

5.5.3 定位错误 203

5.5.4 assert宏 204

小结 206

自测题答案 206

编程项目 209

第6章 I/O流——对象和类入门 213

概述 214

预备知识 214

6.1 流和基本文件I/O 214

6.1.1 文件之于I/O的重要性 215

6.1.2 文件I/O 215

6.1.3 类与对象入门 218

6.1.4 编程提示:检查文件是否成功打开 220

6.1.5 文件I/O技术 222

6.1.6 追加到文件(选读) 224

6.1.7 文件名作为输入(选读) 225

6.2 流I/O工具 228

6.2.1 用流函数格式化输出 228

6.2.2 操纵元 231

6.2.3 流作为函数实参 233

6.2.4 编程提示:检查文件尾 234

6.2.5 命名空间的问题 235

6.2.6 编程实例:整理文件格式 236

6.3 字符I/O 238

6.3.1 get和put成员函数 238

6.3.2 putback成员函数(选读) 241

6.3.3 编程实例:检查输入 241

6.3.4 陷阱:输入中不期而遇的'\n' 243

6.3.5 eof成员函数 245

6.3.6 编程实例:编辑文本文件 247

6.3.7 预定义的字符函数 248

6.3.8 陷阱:toupper和tolower返回值 249

小结 251

自测题答案 251

编程项目 255

第7章 数组 261

概述 262

预备知识 262

7.1 数组入门 262

7.1.1 声明和引用数组 262

7.1.2 编程提示:为数组使用for循环 264

7.1.3 陷阱:数组索引总是从零开始 264

7.1.4 编程提示:为数组长度使用一个已定义常量 264

7.1.5 数组在内存中的表示 265

7.1.6 陷阱:数组索引越界 266

7.1.7 初始化数组 267

7.2 函数中的数组 269

7.2.1 索引变量作为函数参数 269

7.2.2 整个数组作为函数参数 270

7.2.3 const参数修饰符 273

7.2.4 陷阱:不一致地使用const参数 274

7.2.5 返回数组的函数 275

7.2.6 案例分析:产量图 275

7.3 数组编程 285

7.3.1 部分填充数组 285

7.3.2 编程提示:不要吝啬形参 287

7.3.3 编程实例:数组搜索 287

7.3.4 编程实例:数组排序 289

7.4 多维数组 293

7.4.1 多维数组基础 293

7.4.2 多维数组参数 294

7.4.3 编程实例:二维打分程序 295

7.4.4 陷阱:在数组索引之间使用逗号 297

小结 299

自测题答案 299

编程项目 302

第8章 字符串和向量 309

概述 310

预备知识 310

8.1 字符串的一种数组类型 310

8.1.1 C字符串值和C字符串变量 311

8.1.2 陷阱:为C字符串使用=和? 313

8.1.3 〈cstring〉中的其他函数 315

8.1.4 C字符串输入和输出 318

8.1.5 C字符串到数字的转换和可靠输入 320

8.2 标准string类 324

8.2.1 标准类string简介 324

8.2.2 string类的I/O 326

8.2.3 编程提示:getline的其他版本 328

8.2.4 陷阱:混合使用“cin>>变量;”和getline 329

8.2.5 用string类进行字符串处理 330

8.2.6 编程实例:回文测试 333

8.2.7 string对象和C字符串之间的转换 335

8.3 向量 337

8.3.1 向量基础知识 337

8.3.2 陷阱:使用方括号时超出向量长度 339

8.3.3 编程提示:向量赋值具有良好行为 340

8.3.4 效率问题 340

小结 342

自测题答案 342

编程项目 344

第9章 指针和动态数组 349

概述 350

预备知识 350

9.1 指针 350

9.1.1 指针变量 351

9.1.2 基本内存管理 356

9.1.3 陷阱:虚悬指针 356

9.1.4 静态变量和自动变量 356

9.1.5 编程提示:定义指针类型 357

9.2 动态数组 359

9.2.1 数组变量和指针变量 359

9.2.2 创建和使用动态数组 360

9.2.3 指针运算(选读) 363

9.2.4 多维动态数组(选读) 364

小结 367

自测题答案 367

编程项目 368

第10章 定义类 371

概述 372

预备知识 372

10.1 结构 372

10.1.1 用于异种数据的结构 372

10.1.2 陷阱:结构定义中忘记添加分号 376

10.1.3 结构作为函数参数 376

10.1.4 编程提示:使用层次化结构 377

10.1.5 对结构进行初始化 378

10.2 类 381

10.2.1 定义类和成员函数 381

10.2.2 公共成员和私有成员 384

10.2.3 编程提示:将所有成员变量变成私有 389

10.2.4 编程提示:定义取值函数和赋值函数 390

10.2.5 编程提示:将赋值操作符用于对象 391

10.2.6 编程实例:BankAccount类(版本1) 391

10.2.7 总结类的一些特征 395

10.2.8 用于初始化的构造函数 396

10.2.9 编程提示:总是包括一个默认构造函数 401

10.2.10 陷阱:无参数构造函数 402

10.3 抽象数据类型 404

10.3.1 用于生成抽象数据类型的类 404

10.3.2 编程实例:类的另一种实现 407

10.4 继承 411

10.4.1 流类之间的继承关系 411

10.4.2 编程实例:另一个new_line函数 414

10.4.3 函数的默认参数(选读) 414

10.4.4 定义派生类 415

小结 419

自测题答案 419

编程项目 424

第11章 类中的友元函数、重载操作符和数组 429

概述 430

预备知识 430

11.1 友元函数 430

11.1.1 编程实例:一个相等性函数 430

11.1.2 友元函数 432

11.1.3 编程提示:定义取值函数和友元函数 434

11.1.4 编程提示:同时使用成员函数和非成员函数 434

11.1.5 编程实例:Money类(版本1) 435

11.1.6 实现digit_to_int(选读) 440

11.1.7 陷阱:数字常量中的前置零 440

11.1.8 const参数修饰符 441

11.1.9 陷阱:不一致地使用const 443

11.2 重载操作符 446

11.2.1 重载操作符 446

11.2.2 用于自动类型转换的构造函数 449

11.2.3 重载一元操作符 450

11.2.4 重载>>和<< 451

11.3 数组和类 458

11.3.1 类数组 458

11.3.2 数组作为类成员 460

11.3.3 编程实例:用于部分填充数组的一个类 461

11.4 类和动态数组 464

11.4.1 编程实例:一个字符串变量类 464

11.4.2 析构函数 466

11.4.3 陷阱:指针作为传值调用参数 468

11.4.4 拷贝构造函数 469

11.4.5 重载赋值操作符 473

小结 476

自测题答案 476

编程项目 482

第12章 独立编译和命名空间 489

概述 490

预备知识 490

12.1 独立编译 490

12.1.1 ADT回顾 490

12.1.2 案例分析:一个独立编译的类DigitalTime 491

12.1.3 使用#ifndef 498

12.1.4 编程提示:定义其他库 500

12.2 命名空间 502

12.2.1 命名空间和using预编译指令 502

12.2.2 创建命名空间 503

12.2.3 限定名称 505

12.2.4 命名空间的微妙之处(选读) 506

12.2.5 无名命名空间 507

12.2.6 编程提示:为命名空间选择一个名称 510

12.2.7 陷阱:混淆全局命名空间和无名命名空间 511

小结 513

自测题答案 513

编程项目 514

第13章 指针和链表 517

概述 518

预备知识 518

13.1 节点和链表 518

13.1.1 节点 518

13.1.2 链表 522

13.1.3 在表头插入一个节点 523

13.1.4 陷阱:丢失节点 525

13.1.5 搜索链表 526

13.1.6 指针作为迭代器 528

13.1.7 在列表中插入和移除节点 529

13.1.8 陷阱:为动态数据结构使用赋值操作符 531

13.1.9 链表的变体 532

13.1.10 由类构成的链表 534

13.2 栈和队列 537

13.2.1 栈 537

13.2.2 编程实例:一个栈类 537

13.2.3 队列 541

13.2.4 编程实例:一个队列类 541

小结 545

自测题答案 545

编程项目 547

第14章 递归 551

概述 552

预备知识 552

14.1 面向任务的递归函数 553

14.1.1 案例分析:垂直数字 553

14.1.2 深入递归 558

14.1.3 陷阱:无穷递归 559

14.1.4 用于递归的栈 560

14.1.5 陷阱:栈溢出 561

14.1.6 递归与迭代 561

14.2 面向值的递归函数 563

14.2.1 要返回值的递归函数的常规形式 563

14.2.2 编程实例:另一个Powers函数 563

14.3 递归思想 567

14.3.1 递归设计技术 567

14.3.2 案例分析:二叉搜索(递归思想示例) 568

14.3.3 编程实例:一个递归成员函数 574

小结 577

自测题答案 577

编程项目 580

第15章 继承 583

概述 584

预备知识 584

15.1 继承基础 584

15.1.1 派生类 585

15.1.2 派生类中的构造函数 590

15.1.3 陷阱:使用来自基类的私有成员变量 592

15.1.4 陷阱:私有成员函数根本不会继承 593

15.1.5 protected限定符 593

15.1.6 重定义成员函数 595

15.1.7 重定义与重载的比较 597

15.1.8 访问重定义的基函数 598

15.2 继承细节 600

15.2.1 不继承的函数 600

15.2.2 派生类中的赋值操作符和拷贝构造函数 600

15.2.3 派生类中的析构函数 601

15.3 多态性 603

15.3.1 晚期绑定 603

15.3.2 C++中的虚函数 604

15.3.3 虚函数和扩展类型兼容性 607

15.3.4 陷阱:切片问题 610

15.3.5 陷阱:不使用虚成员函数 610

15.3.6 陷阱:试图对虚成员函数定义不齐全的类进行编译 611

15.3.7 编程提示:虚析构函数 611

小结 613

自测题答案 613

编程项目 616

第16章 异常处理 621

概述 622

预备知识 622

16.1 异常处理基础 623

16.1.1 异常处理的一个玩具式例子 623

16.1.2 定义自己的异常类 629

16.1.3 多个throw和catch 630

16.1.4 陷阱:首先捕捉较具体的异常 632

16.1.5 编程提示:异常类可能微不足道 633

16.1.6 在函数中抛出异常 633

16.1.7 异常规范 634

16.1.8 陷阱:派生类中的异常规范 636

16.2 用于异常处理的编程技术 637

16.2.1 抛出异常的时机 637

16.2.2 陷阱:未捕捉的异常 638

16.2.3 陷阱:嵌套的try-catch块 638

16.2.4 陷阱:滥用异常 638

16.2.5 异常类层次结构 638

16.2.6 测试可用内存 639

16.2.7 重新抛出异常 639

小结 640

自测题答案 640

编程项目 641

第17章 模板 643

概述 644

预备知识 644

17.1 用于算法抽象的模板 644

17.1.1 函数模板 645

17.1.2 陷阱:编译器的复杂性 648

17.1.3 编程实例:一个泛化的排序函数 649

17.1.4 编程提示:如何定义模板 652

17.1.5 陷阱:为不恰当的类型使用模板 652

17.2 用于数据抽象的模板 653

17.2.1 类模板的语法 653

17.2.2 编程实例:一个数组类 655

小结 659

自测题答案 659

编程项目 661

第18章 标准模板库 663

概述 664

预备知识 664

18.1 迭代器 664

18.1.1 using声明 665

18.1.2 迭代器的基础知识 665

18.1.3 陷阱:编译器问题 669

18.1.4 迭代器的种类 670

18.1.5 常量和可变迭代器 672

18.1.6 逆向迭代器 673

18.1.7 其他种类的迭代器 675

18.2 容器 676

18.2.1 顺序容器 676

18.2.2 陷阱:迭代器和移除元素 679

18.2.3 编程提示:容器中的类型定义 679

18.2.4 容器配接器stack和queue 679

18.2.5 关联容器set和map 682

18.2.6 效率问题 686

18.3 泛型算法 688

18.3.1 运行时间和大O表示法 688

18.3.2 容器访问运行时间 691

18.3.3 不可修改的序列算法 692

18.3.4 容器修改算法 695

18.3.5 set算法 696

18.3.6 排序算法 697

小结 698

自测题答案 698

编程项目 699

附录1 C++关键字 703

附录2 操作符的优先级 704

附录3 ASCII字符集 705

附录4 部分库函数 706

附录5 内联函数 710

附录6 重载数据索引方括号 711

附录7 this指针 712

附录8 将操作符重载为成员操作符 714