zoukankan      html  css  js  c++  java
  • 完美C++(第5版)(双色)

    完美C++(第5版)(双色)

    薛正华 沈庚 韦远科 译

    ISBN 978-7-121-23198-8

    2014年6月出版

    定价:148.00元

    788

    16

    内容提要

    《完美C++(第5版)》为读者提供了一个学习、理解和掌握 C++编程语言的全面视图,覆盖面广、实用性强。书中介绍了 C++的基本数据类型,如字符串、数组、指针、结构体、类等,同时也详细描述了面向对象编程语言的特性:封装、继承和多态,以及这些特性在 C++语言中的具体使用方式。本书的后面章节还重点介绍了模板、链式数据结构、标准模板库以及异常处理等C++语言的进阶编程知识。这些知识在从事具体编程工作时会经常使用到。

    《完美C++(第5版)》对C++的一些重点知识,辅以实例进行了重点讲解,特别是对一些易混淆、易犯错的知识点,专门以“陷阱”的组织方式进行深入分析和讨论,帮助读者更好地理解和掌握。《完美C++(第5版)》中各章均含有大量例子及完整的代码段和分析,帮助读者强化对关键概念的理解,以及对主题的掌握。各章还配有丰富的自测习题以及答案,帮助读者进一步提升对C++知识的理解以及实际动手编程能力。

    原书由知名学者所著,历经多个版本,根据C++技术的发展,内容不断完善、丰富,体系完整、实践性强。

    《完美C++(第5版)》可以作为高等院校学习编程基本知识以及C++编程语言课程的教材,也可以作为有C++编程经验者的参考书。

    目录

    第1章 C++ 基础 1

    1.1 C++简介 2

    C++语言的起源 2

    C++与面向对象编程 3

    C++的特点 3

    C++术语 3

    C++程序示例 3

    1.2 变量、表达式及赋值语句 5

    标识符 5

    变量 6

    赋值语句 8

    string类简介 9

    陷阱:未初始化变量 9

    提示:采用有意义的变量名 10

    更多赋值语句 11

    赋值兼容性 11

    字面值 12

    转义序列 14

    命名常量 14

    算数运算符和表达式 16

    整数和浮点数除法 17

    陷阱:全整数除法 17

    类型转换 18

    自增和自减运算符 20

    陷阱:求值顺序 21

    1.3 控制台输入/输出 22

    使用cout输出 22

    换行符 23

    提示:以 或endl结束程序 24

    格式化浮点数 24

    用cerr输出 25

    用cin输入 25

    提示:输入/输出中的换行 28

    1.4 编程风格 28

    注释 28

    1.5 库与命名空间 29

    库与include命令 29

    命名空间 29

    陷阱:库名的问题 30

    第2章 流程控制 37

    2.1 布尔表达式 38

    创建布尔表达式 38

    陷阱:不等式连写 39

    布尔表达式求值 40

    优先级规则 41

    陷阱:整数值用作布尔值 44

    2.2 分支机制 45

    if-else语句 45

    复合语句 47

    陷阱:用=代替== 47

    省略else 49

    嵌套语句 49

    多分支if-else语句 49

    switch语句 50

    陷阱:遗漏switch语句中的break 52

    提示:在菜单中使用switch语句 52

    枚举类型 53

    条件运算符 53

    2.3 循环 54

    while和do-while循环 54

    再谈自增和自减运算符 57

    逗号运算符 58

    for语句 59

    提示:重复N次的循环 61

    陷阱:for语句中额外的分号 62

    陷阱:无限循环 62

    break与continue语句 65

    嵌套循环 67

    2.4 文件输入简介 67

    通过ifstream读取文本文件内容 68

    第3章 函数基础 81

    3.1 预定义函数 82

    带有返回值的预定义函数 82

    预定义的void函数 86

    随机数生成器 88

    3.2 自定义函数 91

    定义带有返回值的函数 91

    函数声明的另一种形式 93

    陷阱:参数顺序的错误 93

    调用函数的函数 94

    示例:一个四舍五入的函数 94

    返回布尔值的函数 96

    定义void函数 96

    void函数中的return语句 98

    前提条件和运行结果 98

    main函数 100

    递归函数 100

    3.3 作用域规则 101

    局部变量 101

    过程抽象 103

    全局常量和全局变量 104

    语句块 106

    嵌套作用域 107

    提示:在分支和循环语句中使用函数调用 107

    for循环体中的变量声明 107

    第4章 函数与重载 117

    4.1 参数 118

    传值参数 118

    初识引用参数 120

    引用传递调用机制详解 122

    常量引用参数 124

    示例:函数swapValues 124

    提示:一种操作,而不是代码 125

    混合参数列表 126

    提示:使用何种参数 126

    陷阱:无意的局部变量 128

    提示:选择形参的名字 129

    示例:买比萨 129

    4.2 重载与默认实参 132

    重载简介 132

    陷阱:自动类型转换与重载 134

    重载解析的规则 135

    示例:改写“买比萨程序” 136

    默认参数 138

    4.3 函数的测试和调试 140

    assert宏 140

    占位程序和驱动程序 141

    第5章 数组 151

    5.1 数组简介 152

    数组的声明和引用 152

    提示:对数组使用for循环 154

    陷阱:数组的索引始终是从0开始的 154

    提示:使用已定义的常量作为数组的大小 154

    内存中的数组 155

    陷阱:数组越界 157

    数组的初始化 157

    5.2 函数中的数组 159

    索引变量作为函数实参 159

    整个数组作为函数实参 160

    const修饰符 163

    陷阱:const参数的不一致使用 164

    返回数组的函数 164

    示例:生产图表 165

    5.3 用数组编程 169

    部分填充的数组 169

    提示:不要吝啬形参的使用 169

    示例:查询数组 172

    示例:给数组排序 174

    5.4 多维数组 178

    多维数组基础 178

    多维数组参数 179

    示例:使用二维数组的记分程序 179

    第6章 结构体和类 195

    6.1 结构体 196

    结构体类型 198

    陷阱:漏掉结构体定义末尾的分号 200

    结构体作为函数参数 201

    提示:使用多重结构体 201

    结构体的初始化 204

    6.2 类 206

    定义类和成员函数 206

    封装 211

    公有成员和私有成员 211

    取值和赋值函数 214

    提示:接口和实现的分离 216

    提示:封装的测试 216

    结构体与类 217

    提示:对象思考 217

    第7章 构造函数及其他工具 225

    7.1 构造函数 226

    构造函数的定义 226

    陷阱:无参构造函数 230

    构造函数的显式调用 230

    提示:总是为类定义一个默认构造函数 231

    示例:BankAccount类 233

    类类型成员变量 238

    7.2 其他工具 241

    const修饰符 241

    陷阱:const的不一致用法 243

    内联函数 246

    静态成员 248

    嵌套类和局部类定义 251

    7.3 向量——标准模板库预览 251

    向量基础 252

    陷阱:方括号的索引超过向量的大小 253

    提示:向量的赋值 254

    效率问题 255

    第8章 运算符重载、友元和引用 263

    8.1 基本运算符的重载 264

    重载基础 264

    提示:构造函数可以返回一个对象 269

    返回常量类型 270

    一元运算符的重载 272

    作为成员函数的运算符重载 272

    提示:类可以访问其所有对象 275

    重载函数调用符( ) 275

    陷阱:重载 &&、||及逗号运算符 275

    8.2 友元函数与自动类型转换 276

    构造函数的自动类型转换 276

    陷阱:成员运算符和自动类型转换 277

    友元函数 277

    友元类 280

    陷阱:不支持友元的编译器 281

    8.3 引用和其他运算符重载 282

    引用 282

    提示:返回类的成员变量 283

    重载“>>”和“<<” 284

    提示:应使用什么样的返回值类型 289

    赋值运算符 291

    重载自增和自减运算符 291

    重载数组运算符[ ] 294

    基于左值和右值的重载 296

    第9章 字符串 303

    9.1 字符串类型数组 304

    C字符串值和C字符串变量 304

    陷阱:对C字符串使用 “=” 和 “==” 308

    <cstring>中的其他函数 309

    示例: 命令行参数 311

    C字符串的输入/输出 313

    9.2 字符操作工具 315

    字符的输入/输出 315

    成员函数get和put 315

    示例:使用换行函数检查输入 318

    陷阱:输入时没有处理‘ ’ 319

    成员函数putback、peek和ignore 320

    字符操作函数 322

    陷阱:函数toupper和tolower返回int型数值 324

    9.3 标准string类 325

    标准string类简介 325

    string类的输入和输出 327

    提示:getline函数的其他版本 330

    陷阱:对cin同时使用>>和getline 331

    使用string类处理字符串 331

    示例: 回文检测 335

    string类对象和C字符串的转换 338

    第10章 指针和动态数组 347

    10.1 指针 348

    指针变量 349

    内存管理基础 355

    陷阱:悬空指针 357

    动态变量和自动变量 358

    提示:定义指针类型 358

    陷阱:指针用作传值参数 360

    指针的应用 361

    10.2 动态数组 362

    数组变量和指针变量 362

    创建并使用动态数组 363

    示例:一个返回数组的函数 366

    指针运算 368

    多维动态数组 368

    10.3 类、指针和动态数组 371

    运算符-> 371

    this指针 371

    重载赋值运算符 372

    示例:部分填充数组的类 378

    析构函数 380

    拷贝构造函数 381

    第11章 分散编译和命名空间 391

    11.1 分散编译 392

    封装回顾 392

    头文件和实现文件 393

    示例:DigitalTime类 399

    提示:可重用的组件 401

    使用#ifndef 401

    提示:定义其他库 403

    11.2 命名空间 404

    命名空间和using指令 404

    创建一个命名空间 406

    using声明 409

    限定名称 410

    提示:为命名空间取名 412

    示例:一个定义在命名空间中的类 412

    无名称的命名空间 413

    陷阱:混淆全局命名空间和无名称命名空间 418

    提示:用无名称命名空间代替static修饰符 419

    提示:隐藏帮助函数 419

    嵌套命名空间 420

    提示:应该如何指明使用的命名空间 420

    第12章 流和文件I/O操作 429

    12.1 I/O流 430

    文件I/O 431

    陷阱:流变量的使用限制 434

    向文件追加输出内容 435

    提示: 打开文件的另一种方法 436

    提示:检查一个文件是否已被成功打开 439

    字符I/O 440

    文件结束检查 440

    12.2 I/O流工具 444

    使用文件名输入 444

    使用流函数进行格式化输出 444

    控制符 447

    保存设置的标记 448

    更多的输出流成员函数 449

    示例:整理文件格式 450

    示例:编辑文本文件 452

    12.3 流的继承层次:继承概述 455

    流之间的继承 455

    示例:另一版本的newLine函数 457

    使用类stringstream解析字符串 460

    12.4 随机文件存取 462

    第13章 递归 477

    13.1 递归void函数 478

    示例:竖直排列的数字 479

    跟踪一个递归调用 481

    深入理解递归 484

    陷阱:无限递归 485

    递归调用中的栈 487

    陷阱:栈溢出 488

    递归与迭代的比较 488

    13.2 有返回值的递归函数 489

    有返回值的递归函数的一般形式 489

    示例:另一个幂函数 490

    交叉递归 494

    13.3 按递归方式思考问题 496

    递归设计技巧 496

    二分查找 497

    编码 498

    检查递归是否正确 501

    效率 502

    第14章 继承 513

    14.1 继承基础 514

    派生类 514

    派生类的构造函数 522

    陷阱:使用基类的私有成员变量 524

    陷阱:私有成员函数是无法被有效继承的 526

    protected限定符 526

    成员函数的重定义 529

    重定义与重载 530

    访问被重定义过的基类函数 531

    不可被继承的函数 532

    14.2 利用继承编程 533

    派生类中的赋值运算符和拷贝构造函数 533

    派生类的析构函数 534

    示例:可备份的部分填充的数组 534

    陷阱:赋值运算符两边是同一个对象 541

    示例:PFArrayDBak的另一种实现 542

    提示:一个类可以访问本类所有对象的私有成员 544

    提示:“是一个”和“有一个” 544

    保护继承和私有继承 545

    多继承 546

    第15章 多态与虚函数 555

    15.1 虚函数基础 556

    延迟绑定 556

    C++中的虚函数 557

    提示:virtual属性会被继承 563

    提示:什么时候应该使用虚函数 563

    陷阱:没有对虚成员函数进行定义 564

    抽象类与纯虚函数 564

    示例:抽象类 565

    15.2 指针和虚函数 567

    虚函数与扩展类型兼容性 567

    陷阱:切片问题 571

    提示:使析构函数成为虚函数 572

    向下类型转换和向上类型转换 573

    C++如何实现虚函数 574

    第16章 模板 585

    16.1 函数模板 586

    函数模板语法 587

    陷阱:编译器的复杂性 590

    提示:如何定义模板 592

    示例:一个通用的排序函数 592

    陷阱:使用模板时误用了不正确的数据类型 596

    16.2 类模板 597

    类模板语法 598

    示例:一个数组模板类 601

    模板中的vector和 basic_string 606

    16.3 模板和继承 606

    示例: 带备份的部分填充数组模板类 607

    第17章 链式数据结构 617

    17.1 节点和链表 619

    节点 619

    链表 623

    在链表头插入节点 625

    陷阱:丢失节点 627

    插入和删除链表内的节点 628

    陷阱:对动态数据结构使用赋值运算符 631

    搜索链表 631

    搜索函数伪代码 632

    双向链表 633

    为双向链表增加一个节点 635

    从双向链表中删除一个节点 635

    示例: 使用双向链表实现的通用排序模板函数 641

    17.2 链表的应用 644

    示例:栈模板类 644

    示例:队列模板类 650

    提示:命名空间的注解 652

    友元类以及类似的其他选择 653

    示例:包含节点链的哈希表 655

    字符串哈希函数 656

    哈希表的效率 660

    示例:集合(set)模板类 661

    集合的基本操作 662

    链表创建的集合的效率 667

    17.3 迭代器 668

    指针作为迭代器 668

    迭代器类 669

    示例:迭代器类 670

    17.4 树 676

    树的属性 676

    示例:树模板类 678

    第18章 异常处理 695

    18.1 异常处理基础 696

    异常处理的简单样例 697

    定义自己的异常类 704

    多个抛出和捕获 704

    陷阱:首先捕获比较明确的异常 707

    提示:异常类可以很简单 708

    在函数中抛出异常 708

    异常说明 710

    陷阱:派生类中的异常说明 712

    18.2 异常处理的编程技术 713

    抛出异常的时机 713

    陷阱:未被捕获的异常 714

    陷阱:嵌套try-catch块 715

    陷阱:过度使用异常 715

    异常类层次结构 715

    可用内存测试 716

    再次抛出异常 716

    第19章 标准模板库 721

    19.1 迭代器 723

    迭代器基础 723

    陷阱:编译器问题 726

    迭代器的种类 728

    常量迭代器和可变迭代器 731

    反向迭代器 732

    其他种类的迭代器 733

    19.2 容器 734

    连续容器 734

    陷阱:迭代器和删除元素 738

    提示:容器中的类型定义 739

    容器适配器栈和队列 739

    陷阱:底层容器 740

    关联式容器set和map 742

    效率 747

    19.3 泛型算法 748

    运行时间和大-O表示法 749

    容器访问运行时间 752

    不改变序列的算法 753

    改变序列的算法 757

    集合算法 758

    排序算法 7601

    前言

    本书是介绍C++ 编程语言的教科书,同时也是进行C++ 语言编程的参考书。尽管本书包含了一些编程的相关技巧,但主要还是围绕C++ 语言的特征进行组织的,而不是针对某些编程技术展开的技术教程。本书主要面向在C++ 编程语言方面还没有丰富经验的大学本科学生。因此,作为C++ 编程语言方面的教科书和参考书,本书适合不同层次的读者。本书开始的章节专门为初学者而准备,其中方框中的内容是面向有经验的程序员介绍的C++ 语言的基本语法。后续章节的编写也考虑到了初学者,但主要是针对进阶读者介绍C++ 语言的一些高级主题。本书同样适合那些想自学C++ 语言的读者。(有些读者或许希望能有一本包含更多教学内容和基本编程技巧的教科书,这些读者可以参考我编写的另一本书:Problem Solving with C++,第8 版,Pearson 公司出版。)

    本书很全面地介绍了C++ 语言的相关知识,很多内容超出了初学者应该掌握的范围。例如,本书详细介绍了继承、多态、异常处理和标准模板库(STL)的相关知识。

    新版变化

    第5 版和第4 版采用了相同的编程哲学。对于教师而言,无须改变课程各主题的顺序以及各主题对应的章节和具体内容。相比第4 版,此次更新的内容包括:

    第1 章增加了字符串类的简单介绍;第2 章增加了文本文件数据读取的简单介绍。增加这些内容后,教师可以很方便地从第2 章开始就向学生引入大规模的或者现实世界中存在的问题。

    第12 章增加了对stringstream 的介绍,从而方便在string 类型和其他类型之间做类型转换。

    第13 章简捷地介绍了尾递归的概念并且给出了一个相互递归的例子。增加了10 个自测练习题和25 个编程项目练习。同时,应读者的要求,部分新增的题目更长且具有更少的限制,给学生留下了更多发挥的空间,可以让他们设计编程方案的能力得到更好的锻炼。

    更正了第4 版中出现的几个错误。

    ANSI/ISO C++ 标准

    本书介绍的所有内容完全依照最新的ANSI/ISO C++ 语言标准进行。

    标准模板库

    标准模板库(STL)是一个预先编写好的包含很多数据结构和算法的编程库。STL的相关知识和内容恐怕和C++ 核心知识不相上下,因此本书使用了足够多的篇幅介绍它。书中有一整章的内容是介绍模板的,此外有一整章用来详细介绍STL。除此之外,其他相关知识点中也包含对STL 相关内容的介绍。

    面向对象编程

    本书是按照C++ 语言的结构组织的。这样一来,书中前面的几章都是关于C++ 语言的基本知识,这与介绍其他高级编程语言的书大同小异,并没有专门针对面向对象编程(OOP)。这使得本书适合成为一本参考书,或者用来学习第二门编程语言。考虑到C++ 是一门面向对象编程语言,如果读者使用C++ 而不是C 来进行编程,还是得掌握C++ 语言的面向对象特性。基于此,本书的内容全面涵盖了封装、继承和多态这些C++ 已经实现的面向对象特性。

    章节顺序的灵活性

    本书允许教师自由安排教学内容的顺序,对一本参考书而言,这一点是很重要的。作者不会强制教师们按照本书的知识顺序安排自己的课程,这不符合自由灵活的设计哲学。为此,本书各章节的开头都给出了学习本章节需要的知识准备。

    让学生更容易接受

    作为一本参考书,只把章节顺序安排好是不够的,此外,确保书中内容的正确和让教师能有清晰的理解也是不够的。重点在于如何向初学者呈现书中的内容,从而让他们容易理解。就像作者其他的书一样,本书对学生非常友好,易于学习和理解。

    要点总结框

    书中的每个关键知识点都会出现在一个总结方框中。这些要点总结框贯穿了书中的各个章节,可以作为知识点的总结和快速参考内容。此外,这些要点总结框还可以让读者方便地查阅那些自己已经有所了解但不清楚C++ 语言是如何使用的语法特性。

    自测练习

    各章节都包含了许多自测练习题,各练习题目的完整答案都在章节的结尾处给出。

    其他特性

    本书的各章节都包含一些陷阱、编程技巧和示例的小节,还有一些完整的代码示例,并且都配有程序输入和输出的示例。每章的结尾都给出了总结和相关编程练习。

    本书英文原版的参考网址

    本书英文原版的参考网址为www.pearsonhighered.com/savitch 及www.pearsonhighered.com/cssupport。关于本书英文原版的相关资源,请与cece.zhang@pearson.com 联系并获取。

    致谢

    本书的出版得益于许多人提供的宝贵帮助和支持。Addison-Wesley 公司的FrankRuggirello 和Susan Hartman 最先提出了本书的构思并促成了第1 版的面世,对此我充满了感激之情。作为本书第2 版、第3 版以及第4 版的编辑,Matt Goldstein 的帮助和付出是本书持续更新和面世的关键,对此我报以诚挚的谢意。我还要感谢Pearson 公司的Chelsea Kharakozova、Marilyn Lloyd、Yez Alayan 以及所有其他工作人员,感谢他们无私的支持和鼓励。

    以下审阅者对本书提供了宝贵的建议,感谢他们的付出和宝贵建议:

    Richard Albright University of Delaware

    J. Boyd Trolinger Butte College

    Jerry K. Bilbrey, Jr Francis Marion University

    Albert M. K. Cheng University of Houston

    David Cherba Michigan State University

    Fredrick H. Colclough Colorado Technical University

    Drue Coles Boston University

    Stephen Corbesero Moravian College

    Christopher E. Cramer

    Ron DiNapoli Cornell University

    Qin Ding Pennsylvania State University, Harrisburg

    Martin Dulberg North Carolina State University

    H. E. Dunsmore Purdue University

    Evan Golub University of Maryland

    Terry Harvey University of Delaware

    Joanna Klukowska Hunter College, CUNY

    Lawrence S. Kroll San Francisco State University

    Stephen P. Leach Florida State University

    Alvin S. Lim Auburn University

    Tim H. Lin Cal Poly Pomona

    R. M. Lowe Clemson University

    Jeffrey L. Popyack Drexel University

    Amar Raheja Cal Poly Pomona

    Victoria Rayskin University of Central Los Angeles

    Loren Rhodes Juniata College

    Jeff Ringenberg University of Michigan

    Victor Shtern Boston University

    Aaron Striegel University of Notre Dame

    J. Boyd Trolinger Butte College

    Chrysafis Vogiatzis University of Florida

    Joel Weinstein Northeastern University

    Dick Whalen College of Southern Maryland

    特别感谢Kenrick Mock(阿拉斯加大学安克雷奇分校),他负责本书第5 版的更新。为此,他付出了许多辛劳,再一次地满足了我、编辑及他自己对本书提出的苛刻要求。

  • 相关阅读:
    [LeetCode] 294. Flip Game II 翻转游戏之二
    [LeetCode] 293. Flip Game 翻转游戏
    [LeetCode] 266. Palindrome Permutation 回文全排列
    [LeetCode] 288. Unique Word Abbreviation 独特的单词缩写
    [LeetCode] Self Crossing 自交
    [LeetCode] 281. Zigzag Iterator 之字形迭代器
    [LeetCode] 251. Flatten 2D Vector 压平二维向量
    [LeetCode] 250. Count Univalue Subtrees 计数相同值子树的个数
    [LeetCode] 249. Group Shifted Strings 群组偏移字符串
    [LeetCode] 248. Strobogrammatic Number III 对称数之三
  • 原文地址:https://www.cnblogs.com/broadview/p/3853888.html
Copyright © 2011-2022 走看看