21天学通C++:第五版

21天学通C++:第五版
作 者: Jesse Liberty Bradley Jones 李佩乾 杨小珂 李佩乾
出版社: 人民邮电出版社
丛编项:
版权说明: 本书为公共版权或经版权方授权,请支持正版图书
标 签: C++
ISBN 出版时间 包装 开本 页数 字数
未知 暂无 暂无 未知 0 暂无

作者简介

  Jesse Liberty编著了大量有关软件开发的图书,其中包括C++和.NET方面的畅销书。他是Liberty Associates公司的总裁,该公司致力于为客户提供编程、咨询和培训方面的服务。Bradley Jones是 Microsoft Visual C++MVP,他身兼网站管理员、经理、编码大师、执行编辑等职,其主要精力放在众多软件开发网站和频道上,其中包括Developer.com、CodeGuru.com、DevX、VBForums、Gamelan以及Jupitermedia的其他网站。这些影响力在不断扩大的网站每月为250万开发人员提供信息。

内容简介

本书是根据2003年的ISO/ANSI C++标准编写的,通过大量短小精悍的范例程序详细而全面地阐述了C++的基本概念和技术,包括控制输入/输出、循环和数组、面向对象编程、模板和创建C++应用程序等。这些内容被组织成结构合理、联系紧密的章节;每章都提供了范例程序清单,并辅以范例输出和代码分析,以演示该章介绍的主题。为加深读者对所学内容的理解,每章最后都提供了常见问题及其答案以及测验和练习。读者可对照附录D提供的测验和练习答案,了解自己对所学内容的掌握程度。 本书是针对C++初学者编写的,不要求读者有C语言方面的背景知识,可作为高等院校教授C++课程的教材,也可供初学者自学C++时使用。

图书目录

第1周课程简介

第1章 绪论 2

1.1 C++简史 2

1.1.1 解决问题 3

1.1.2 过程化编程、结构化编程和面向对象编程 3

1.1.3 面向对象编程(OOP) 4

1.1.4 C++和面向对象编程 4

1.2 C++的发展历程 5

1.3 应该先学习C语言吗 5

1.4 C++、Java和C# 5

1.5 微软的C++可控扩展 5

1.6 ANSI标准 5

1.7 编程准备 6

1.8 开发环境 6

1.9 创建程序的步骤 7

1.9.1 用编译器生成对象文件 7

1.9.2 用链接器生成可执行文件 7

1.10 程序开发周期 7

1.11 HELLO.cpp:第一个C++程序 8

1.12 编译器初步 9

1.13 编译错误 10

1.14 小结 10

1.15 问与答 10

1.16 作业 11

1.16.1 测验 11

1.16.2 练习 11

第2章 C++程序的组成部分 12

2.1 一个简单程序 12

2.2 cout简介 13

2.3 使用标准名称空间 15

2.4 对程序进行注释 16

2.4.1 注释的类型 17

2.4.2 使用注释 17

2.4.3 有关注释的警告 18

2.5 函数 18

2.5.1 使用函数 19

2.5.2 方法和函数 20

2.6 小结 20

2.7 问与答 20

2.8 作业 21

2.8.1 测验 21

2.8.2 练习 21

第3章 使用变量和常量 22

3.1 什么是变量 22

3.1.1 将数据存储在内存中 22

3.1.2 预留内存 22

3.1.3 整型变量的大小 23

3.1.4 基本变量类型 24

3.2 定义变量 25

3.2.1 区分大小写 26

3.2.2 命名规则 26

3.2.3 关键字 26

3.3 一次创建多个变量 27

3.4 给变量赋值 27

3.5 使用typedef来创建别名 28

3.6 何时使用short和long 29

3.6.1 unsigned整型变量的回绕 30

3.6.2 signed整型变量的回绕 30

3.7 使用字符 31

3.7.1 字符和数字 32

3.7.2 特殊打印字符 32

3.8 常量 33

3.8.1 字面常量 33

3.8.2 符号常量 33

3.9 枚举常量 34

3.10 小结 36

3.11 问与答 36

3.12 作业 37

3.12.1 测验 37

3.12.2 练习 37

第4章 创建表达式和语句 38

4.1 语句简介 38

4.1.1 使用空白 38

4.1.2 语句块和复合语句 38

4.2 表达式 39

4.3 使用运算符 40

4.3.1 赋值运算符 40

4.3.2 数学运算符 40

4.3.3 整数除法和求模 41

4.4 赋值运算符与数学运算符的组合 42

4.5 递增和递减 42

4.6 理解运算符优先级 44

4.7 括号的嵌套 45

4.8 真值的本质 45

4.9 if语句 46

4.9.1 缩进风格 49

4.9.2 else语句 49

4.9.3 高级if语句 51

4.10 在嵌套if语句中使用大括号 52

4.11 使用逻辑运算符 54

4.11.1 逻辑AND运算符 54

4.11.2 逻辑OR运算符 55

4.11.3 逻辑NOT运算符 55

4.12 简化求值 55

4.13 关系运算符的优先级 55

4.14 再谈真和假 56

4.15 条件运算符(三目运算符) 56

4.16 小结 57

4.17 问与答 58

4.18 作业 58

4.18.1 测验 58

4.18.2 练习 59

第5章 组织成函数 60

5.1 什么是函数 60

5.2 返回值、参数和实参 61

5.3 声明和定义函数 61

5.3.1 函数原型 62

5.3.2 定义函数 62

5.4 函数的执行 64

5.5 确定变量的作用域 64

5.5.1 局部变量 64

5.5.2 作用域为语句块的局部变量 65

5.6 参数是局部变量 66

5.6.1 全局变量 67

5.6.2 有关全局变量的注意事项 69

5.7 创建函数语句时的考虑因素 69

5.8 再谈函数实参 69

5.9 再谈返回值 70

5.10 默认参数 71

5.11 重载函数 73

5.12 函数特有的主题 76

5.12.1 内联函数 76

5.12.2 递归 77

5.13 函数的工作原理 81

5.13.1 抽象层次 81

5.13.2 划分RAM 81

5.13.3 堆栈和函数 83

5.14 小结 83

5.15 问与答 83

5.16 作业 84

5.16.1 测验 84

5.16.2 练习 84

第6章 理解面向对象编程 86

6.1 C++是面向对象的吗 86

6.2 创建新类型 86

6.3 类和成员简介 87

6.3.1 声明类 88

6.3.2 有关命名规则的说明 88

6.3.3 定义对象 88

6.3.4 类与对象 88

6.4 访问类成员 89

6.4.1 给对象而不是类赋值 89

6.4.2 类不能有没有声明的功能 89

6.5 私有和公有 90

6.6 实现类方法 94

6.7 添加构造函数和析构函数 96

6.7.1 默认构造函数和析构函数 96

6.7.2 使用默认构造函数 96

6.8 const成员函数 99

6.9 接口与实现 99

6.10 将类声明和方法定义放在什么地方 101

6.11 内联实现 102

6.12 将他类用作成员数据的类 104

6.13 结构 107

6.14 小结 108

6.15 问与答 108

6.16 作业 109

6.16.1 测验 109

6.16.2 练习 109

第7章 再谈程序流程 111

7.1 循环 111

7.1.1 循环的鼻祖:goto 111

7.1.2 为何避免使用goto语句 112

7.2 使用while循环 112

7.2.1 更复杂的while语句 113

7.2.2 continue和break简介 114

7.2.3 while(true)循环 116

7.3 实现do...while循环 117

7.4 使用do...while 118

7.5 for循环 120

7.5.1 高级for循环 122

7.5.2 空for循环 124

7.5.3 循环嵌套 124

7.5.4 for循环中声明的变量的作用域 126

7.6 循环小结 126

7.7 使用switch语句控制程序流程 128

使用switch语句来处理菜单 130

7.8 小结 133

7.9 问与答 133

7.10 作业 134

7.10.1 测验 134

7.10.2 练习 134

第1周复习

第2周课程简介

第8章 理解指针 144

8.1 什么是指针 144

8.1.1 内存简介 144

8.1.2 获取变量的内存地址 144

8.1.3 将变量的地址存储到指针中 145

8.1.4 指针名 146

8.1.5 获取指针指向的变量的值 146

8.1.6 使用间接运算符解除引用 147

8.1.7 指针、地址和变量 147

8.1.8 使用指针来操纵数据 148

8.1.9 查看地址 149

8.2 为什么使用指针 151

8.3 栈和自由存储区(堆) 151

8.3.1 使用关键字new来分配内存 152

8.3.2 使用关键字delete归还内存 152

8.4 再谈内存泄漏 154

8.5 在自由存储区上创建对象 154

8.6 删除自由存储区中的对象 155

8.7 访问数据成员 156

8.8 在自由存储区中创建成员数据 157

8.9 this指针 159

8.10 迷途指针 160

8.11 使用const指针 162

8.11.1 const 指针和const成员函数 162

8.11.2 使用const this指针 164

8.12 小结 164

8.13 问与答 165

8.14 作业 165

8.14.1 测验 165

8.14.2 练习 165

第9章 使用引用 167

9.1 什么是引用 167

9.2 将地址运算符用于引用 168

9.3 引用对象 170

9.4 空指针和空引用 172

9.5 按引用传递函数参数 172

9.5.1 使用指针让swap()管用 173

9.5.2 使用引用来实现swap() 174

9.6 理解函数头和原型 176

9.7 返回多个值 176

9.8 按引用传递以提高效率 179

9.8.1 传递const指针 181

9.8.2 用引用代替指针 183

9.9 何时使用引用和指针 185

9.10 混合使用引用和指针 186

9.11 返回指向不在作用域中的对象的引用 186

9.12 指针归谁所有 189

9.13 小结 190

9.14 问与答 190

9.15 作业 190

9.15.1 测验 190

9.15.2 练习 191

第10章 有关函数的高级主题 192

10.1 重载成员函数 192

10.2 使用默认值 194

10.3 在默认值和重载函数之间做出选择 196

10.4 默认构造函数 196

10.5 重载构造函数 196

10.6 初始化对象 198

10.7 复制构造函数 199

10.8 运算符重载 202

10.8.1 编写一个递增函数 203

10.8.2 重载前缀运算符 203

10.8.3 运算符重载函数的返回类型 205

10.8.4 返回无名临时对象 206

10.8.5 使用this指针 207

10.8.6 重载后缀运算符 209

10.8.7 前缀和后缀之间的差别 209

10.8.8 重载双目数学运算符 210

10.8.9 运算符重载中存在的问题 213

10.8.10 对运算符重载的限制 213

10.8.11 重载什么 214

10.8.12 赋值运算符 214

10.9 处理数据类型转换 216

10.10 转换运算符 218

10.11 小结 219

10.12 问与答 220

10.13 作业 220

10.13.1 测验 220

10.13.2 练习 221

第11章 面向对象分析及设计 222

11.1 建立模型 222

11.2 软件设计:建模语言 222

11.3 软件设计:过程 223

11.3.1 迭代式开发和瀑布式开发 223

11.3.2 迭代式开发过程 224

11.4 第1步:概念化阶段——从愿景开始 225

11.5 第2步:分析阶段——收集需求 225

11.5.1 用例 225

11.5.2 应用分析 232

11.5.3 系统分析 232

11.5.4 规划文档 233

11.5.5 可视化 233

11.5.6 可交付品 233

11.6 第3步:设计阶段 234

11.6.1 什么是类 234

11.6.2 转换 235

11.6.3 其他转换 235

11.6.4 建立静态模型 236

11.6.5 动态模型 241

11.7 第4~6步:实现、测试和交付 243

11.8 迭代 244

11.9 小结 244

11.10 问与答 244

11.11 作业 244

11.11.1 测验 245

11.11.2 练习 245

第12章 实现继承 246

12.1 什么是继承 246

12.1.1 继承和派生 246

12.1.2 动物世界 247

12.1.3 派生的语法 247

12.2 私有和保护 248

12.3 构造函数和析构函数的继承性 250

12.4 覆盖基类函数 256

12.4.1 隐藏基类方法 258

12.4.2 调用基类方法 259

12.5 虚方法 261

12.5.1 虚函数的工作原理 264

12.5.2 通过基类指针访问派生类的方法 265

12.5.3 切除 265

12.5.4 创建虚析构函数 267

12.5.5 虚复制构造函数 267

12.5.6 使用虚方法的代价 270

12.6 小结 270

12.7 问与答 271

12.8 作业 271

12.8.1 测验 271

12.8.2 练习 271

第13章 管理数组和字符串 273

13.1 什么是数组 273

13.1.1 访问数组元素 273

13.1.2 在数组末尾后写入数据 275

13.1.3 护栏柱错误 277

13.1.4 初始化数组 277

13.1.5 声明数组 278

13.2 使用对象数组 279

13.2.1 声明多维数组 280

13.2.2 初始化多维数组 281

13.3 指针数组 282

13.4 指针算术 284

13.5 在自由存储区声明数组 286

13.5.1 数组指针和指针数组 286

13.5.2 指针和数组名 287

13.5.3 删除自由存储区中的数组 288

13.5.4 在运行阶段调整数组大小 288

13.6 字符数组和字符串 291

13.7 使用方法strcpy()和strncpy() 292

13.8 String类 294

13.9 链表和其他结构 299

13.10 创建数组类 300

13.11 小结 300

13.12 问与答 300

13.13 作业 301

13.13.1 测验 301

13.13.2 练习 301

第14章 多态 302

14.1 单继承存在的问题 302

14.1.1 提升 304

14.1.2 向下转换 304

14.1.3 将对象添加到链表中 306

14.2 多重继承 307

14.2.1 多重继承对象的组成部分 310

14.2.2 多重继承对象中的构造函数 310

14.2.3 歧义解析 312

14.2.4 从共同基类继承 313

14.2.5 虚继承 316

14.2.6 多重继承存在的问题 319

14.2.7 混合(功能)类 320

14.3 抽象数据类型 320

14.3.1 纯虚函数 323

14.3.2 实现纯虚函数 324

14.3.3 复杂的抽象层次结构 327

14.3.4 哪些类是抽象的 330

14.4 小结 331

14.5 问与答 331

14.6 作业 332

14.6.1 测验 332

14.6.2 练习 332

第2周复习

第3周课程简介

第15章 特殊类和函数 344

15.1 在同一种类型的对象之间共享数据:静态成员数据 344

15.2 静态成员函数 348

15.3 函数指针 350

15.3.1 为什么使用函数指针 353

15.3.2 函数指针数组 356

15.3.3 将函数指针传递给其他函数 358

15.3.4 将typedef用于函数指针 360

15.4 成员函数指针 363

15.5 小结 367

15.6 问与答 367

15.7 作业 367

15.7.1 测验 367

15.7.2 练习 368

第16章 高级继承 369

16.1 聚合 369

16.1.1 访问被聚合类的成员 375

16.1.2 控制对被聚合成员的访问 375

16.1.3 聚合的代价 376

16.1.4 按值传递导致复制 378

16.2 以继承方式实现和聚合/代理 381

16.3 私有继承 390

16.4 添加友元类 398

16.5 友元函数 406

16.6 友元函数和运算符重载 406

16.7 重载插入运算符 410

16.8 小结 414

16.9 问与答 414

16.10 作业 415

16.10.1 测验 415

16.10.2 练习 415

第17章 处理流 418

17.1 流概述 418

17.1.1 数据流的封装 418

17.1.2 理解缓冲技术 419

17.2 流和缓冲区 420

17.3 标准I/O对象 420

17.4 重定向标准流 421

17.5 使用cin进行输入 421

17.5.1 输入字符串 422

17.5.2 字符串的问题 423

17.5.3 >>的返回值 425

17.6 cin的其他成员函数 425

17.6.1 单字符输入 425

17.6.2 从标准输入读取字符串 428

17.6.3 使用cin.ignore() 430

17.6.4 查看和插入字符:peek()和putback() 431

17.7 使用cout进行输出 432

17.7.1 刷新输出 432

17.7.2 执行输出的函数 432

17.7.3 控制符、标记和格式化指令 433

17.8 流和printf()函数之比较 437

17.9 文件输入和输出 439

17.10 使用ofstream 439

17.10.1 条件状态 440

17.10.2 打开文件进行输入和输出 440

17.10.3 修改ofstream打开文件时的默认行为 441

17.11 二进制文件和文本文件 443

17.12 命令行处理 445

17.13 小结 448

17.14 问与答 448

17.15 作业 448

17.15.1 测验 448

17.15.2 练习 449

第18章 创建和使用名称空间 450

18.1 简介 450

18.2 根据名称解析函数和类 450

18.2.1 变量的可见性 451

18.2.2 链接性 452

18.2.3 静态全局变量 453

18.3 创建名称空间 453

18.3.1 声明和定义类型 454

18.3.2 在名称空间外定义函数 455

18.3.3 添加新成员 455

18.3.4 嵌套名称空间 455

18.4 使用名称空间 456

18.5 关键字using 457

18.5.1 using编译指令 457

18.5.2 using声明 459

18.6 名称空间别名 460

18.7 未命名的名称空间 460

18.8 标准名称空间std 461

18.9 小结 462

18.10 问与答 463

18.11 作业 463

18.11.1 测验 463

18.11.2 练习 464

第19章 模板 465

19.1 什么是模板 465

19.2 创建模板定义 466

19.2.1 使用名称 467

19.2.2 实现模板 468

19.3 将实例化的模板对象传递给函数 471

19.4 模板和友元 472

19.4.1 非模板友元类和函数 472

19.4.2 通用模板友元类和函数 475

19.5 使用模板对象 479

19.5.1 使用具体化函数 483

19.5.2 静态成员和模板 488

19.6 标准模板库 491

19.6.1 使用容器 492

19.6.2 理解顺序容器 492

19.6.3 理解关联容器 499

19.6.4 使用算法类 502

19.7 小结 505

19.8 问与答 505

19.9 作业 505

19.9.1 测验 506

19.9.2 练习 506

第20章 处理错误和异常 508

20.1 程序中的各种错误 508

20.2 异常的基本思想 509

20.2.1 异常处理的组成部分 510

20.2.2 手工引发异常 512

20.2.3 创建异常类 513

20.3 使用try块和catch块 516

20.4 捕获异常的工作原理 517

20.4.1 使用多条catch语句 517

20.4.2 异常层次结构 520

20.5 异常中的数据及给异常对象命名 522

20.6 异常和模板 529

20.7 没有错误的异常 531

20.8 关于代码蜕变 532

20.9 bug和调试 532

20.9.1 断点 532

20.9.2 监视点 532

20.9.3 查看内存 532

20.9.4 查看汇编代码 532

20.10 小结 533

20.11 问与答 533

20.12 作业 533

20.12.1 测验 534

20.12.2 练习 534

第21章 杂项内容 535

21.1 预处理器和编译器 535

21.2 预处理器指令#define 535

21.2.1 使用#define来定义常量 536

21.2.2 将#define用于检测 536

21.2.3 预编译器命令#else 536

21.3 包含和多重包含防范 538

21.4 宏  538

21.5 字符串操纵 540

21.5.1 字符串化 540

21.5.2 拼接 540

21.6 预定义的宏 541

21.7 assert()宏 541

21.7.1 使用assert()进行调试 542

21.7.2 assert()与异常之比较 542

21.7.3 副作用 543

21.7.4 类的不变量 543

21.7.5 打印中间值 548

21.7.6 宏与函数及模板之比较 549

21.8 内联函数 549

21.9 位运算 550

21.9.1 “与”运算符 551

21.9.2 “或”运算符 551

21.9.3 “异或”运算符 551

21.9.4 “求补”运算符 551

21.9.5 设置位 551

21.9.6 清除位 552

21.9.7 反转位 552

21.9.8 位字段 552

21.10 编程风格 555

21.10.1 缩进 555

21.10.2 大括号 555

21.10.3 长代码行和函数长度 555

21.10.4 格式化switch语句 556

21.10.5 程序文本 556

21.10.6 标识符命名 556

21.10.7 名称的拼写和大写 557

21.10.8 注释 557

21.10.9 设置访问权限 557

21.10.10 类定义 558

21.10.11 包含文件 558

21.10.12 使用assert() 558

21.10.13 使用const 558

21.11 C++开发工作的下一步 558

21.11.1 从何处获得帮助和建议 558

21.11.2 相关的C++主题:受控C++、C#和Microsoft的.NET 559

21.11.3 保持联系 559

21.12 小结 559

21.13 问与答 559

21.14 作业 560

21.14.1 测验 560

21.14.2 练习 561

第3周复习

附录A 二进制和十六进制 574

A.1 其他进制 574

A.2 不同进制之间的转换 575

A.2.1 二进制 575

A.2.2 为什么使用二进制 576

A.2.3 位、字节和半字节 576

A.2.4 什么是KB 576

A.2.5 二进制数 576

A.3 十六进制 577

附录B C++关键字 580

附录C 运算符优先级 581

附录D 答案 582

第1章 582

第2章 582

第3章 584

第4章 585

第5章 585

第6章 587

第7章 590

第8章 591

第9章 592

第10章 594

第11章 598

第12章 601

第13章 602

第14章 603

第15章 604

第16章 610

第17章 613

第18章 615

第19章 616

第20章 620

第21章 625

附录E 链表简介 627