首页>参考读物>计算机科学与技术>软件与程序设计

Accelerated C++中文版
作者 : Andrew Koenig;Barbara E. Moo
译者 : 靳志伟
丛书名 : C++设计新思维
出版日期 : 2007-10-11
ISBN : 7-111-22404-4
定价 : 39.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 293
开本 : 16开
原书名 : Accelerated C++:Practical Programming by Example
原出版社: Addison-Wesley
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

C++之父倍加推崇的C++教材
  Francis Glassborow的《C++编程你也行》和Koenig & Moo的《Accelerated C++》是打破旧式而令人厌烦的教育方式的例子。
                         ——C++之父Bjarne Stroustrup

  为什么本书给人的印象会如此深刻呢?这是因为:
  ● 一开始就介绍那些最有用的概念,而不是那些简单的注释;读者很快就能够以此开始编程;
  ● 描述现实中的问题和解决方案,而不是单纯的语言特性;读者不但学习到了这些特性,而且还知道如何把它们应用到程序中去。
  ● 涵盖了语言本身和标准库;读者可以从一开始就使用标准库来编写自己的程序。
  
  作者通过在美国斯坦福大学的教学经验证明了这种方法的有效性—在那里,学生们在编程语言第一堂课中就学习到了如何编写真实的程序。
  不管你是一个渴望开始学习C++编程的新手,还是一个已经使用C++多年并对它有了很深了解的老手,本书作者独特的教学方法和经验都使得本书应该成为你书架中不可缺少的一员。

图书特色

图书前言

“C++设计新思维”丛书前言
  自C++诞生尤其是ISO/ANSI C++标准问世以来,以Bjarne Stroustrup为首的C++社群领袖一直不遗余力地倡导采用“新风格”教学和使用C++。事实证明,除了兼容于C的低阶特性外,C++提供的高级特性以及在此基础上发展的各种惯用法可以让我们编写出更加简洁、优雅、高效、健壮的程序。
  这些高级特性和惯用法包括精致且高效的标准库和各种“准标准库”,与效率、健壮性、异常安全等主题有关的各种惯用法,以及在C++的未来占据更重要地位的模板和泛型程序设计技术等。它们发展于力量强大的C++社群,并被这个社群中最负声望的专家提炼、升华成一本本精彩的著作。毫无疑问,这些学术成果必将促进C++社群创造出更多的实践成果。
  我个人认为,包括操作系统、设备驱动、编译器、系统工具、图像处理、数据库系统以及通用办公软件等在内的基础软件更能够代表一个国家的软件产业发展质量,迄今为止,此类基础性的软件恰好是C++所擅长开发的,因此,可以感性地说,C++的应用水平在一定程度上可以折射出一个国家的软件产业发展水平和健康程度。
  前些年国内曾引进出版了一大批优秀的C++书籍,它们拓宽了中国C++程序员的视野,并在很大程度上纠正了长期以来存在于C++的教育、学习和使用方面的种种误解,对C++相关的产业发展起到了一定的促进作用。然而在过去的两年中,随着.NET、Java技术吸引越来越多的注意力,中国软件产业业务化、项目化的状况愈发加剧,擅长于“系统编程”的C++语言的应用领域似有进一步缩减的趋势,这也导致人们对C++的出版教育工作失去了应有的重视。
  机械工业出版社华章分社决定继续推动中国C++“现代化”教育,从2006年起将陆续推出一套“C++设计新思维”丛书。这套丛书秉持精品、高端的理念,其作译者为包括Herb Sutter在内的国内外知名C++技术专家和研究者、教育者,议题紧密围绕现代C++特性,以实用性为主,兼顾实验性和探索性,形式上则是原版影印、中文译著和原创兼收并蓄。每一本书相对独立且交叉引用,篇幅短小却内容深入。作为这套丛书的特邀技术编辑,我衷心希望它们所展示的技术、技巧和理念能够为中国C++社群注入新的活力。

  荣  耀
  2005年12月
  南京师范大学
  www.royaloo.com


  学习C++编程的新方法
  我们假定你想要快速地学习如何编写实用的C++程序。因此,我们首先讲述了C++中最有用的部分。这种学习的策略虽然显而易见,但是这种策略的根本含义是指,即便C++是以C语言为基础的,我们也不会从教授C语言开始。相反,我们从开始就使用了高级的数据结构,而在后面才解释这些数据结构的基础。这种方法可以让你马上开始编写地道的C++程序。
  我们的方法还有一个地方比较特殊:我们关注如何解决问题,而不是关注探讨语言和标准库的特征。当然,我们也讲述了这些特征,但是这样做只是为了给程序提供支持,而不是用程序来证明这些特征。
  由于本书教授C++编程,而不仅仅是教授语言特征,所以对于已经有一些C++基础,而且想以更自然、更高效的风格来使用这门语言的读者来说,本书非常有用。初学C++语言的人,往往学习了语言技巧,但是并不知道如何使用这门语言来解决日常的问题。
  我们的方法对于初学者和有经验的程序员同样有效
  在过去的每个暑假,我们常常在斯坦福大学教授为期一周的C++强化课程。我们最初也选用传统的方法来教授这门课程:假定学生已经了解C语言,我们就从展示如何定义类开始,有系统地过渡到语言的其他方面。我们发现学生在头两天就会感到困惑和挫败感—直到他们学到足够的知识,能够开始编写有用的程序时,困惑和挫败感才会消失。而且一旦达到这种境界,他们就会学习得非常快。
  当我们接触到对崭新的标准库提供了足够支持的C++实现时,我们就开始重新设计这门课程。新的课程从一开始就使用标准库,关注编写实用的程序,在学生掌握了足以让他们有效地使用语言细节的时候,我们才开始教授这些细节。
  在采用这种方法后,我们发现了戏剧化的结果:学习了一天之后,学生就能够编写程序,而如果采用原先的课程方式,这可能要花费几乎一周的时间。另外,学生开始的挫败感也消失了。
  抽象
  我们的方法之所以有效,只是因为C++已经成熟了,我们对它的理解也成熟了。这种成熟条件使得我们可以忽略早期的C++程序和程序员所依赖的低级概念。
  这种可以忽略细节的能力就是成熟技术的特征。比如,早期的汽车经常会出现故障,使得每个司机都不得不成为一个业余的汽车修理工。如果一个司机在汽车出现问题后,就不知道如何回家的话,是非常危险的。但是今天的司机无须了解详细的工程知识,就可以驾驶汽车了。当然今天的司机也可能由于别的原因而想学习详细的工程知识,但那是另一回事了。
  我们把抽象定义为可选择的忽略,即仅仅关注那些与手头工作相关的概念,而忽略其他东西。我们认为这是现代编程中最重要的思想。要想编写一个成功的程序,关键在于了解问题的哪些部分应该考虑,哪些部分应该忽略。每种编程语言都提供了创建有用的抽象的工具,而且每个成功的程序员都知道如何使用这些工具。
  我们认为抽象非常有用,所以我们在本书中到处都可以看到抽象的概念。当然,我们并不总是直接把它们叫做抽象,因为抽象的形式太多了。相反,我们提到了函数、数据结构、类和继承,所有这些都是抽象。而且我们并不只是提到这些概念,本书到处都会使用这些概念。
  如果可以很好地设计抽象并选取适当的抽象,我们相信,即便不理解这些抽象工作的细节,也可以使用它们。我们无须成为汽车修理工就能驾驶汽车,所以我们也无须理解C++工作的所有细节就能使用它们。
  本书覆盖面
  如果你的确要用C++编程的话,就需要掌握本书的所有知识,尽管本书并没有告诉你你想知道的一切。
  这句话听起来有些荒谬,但事实确实如此。像本书这样厚的书不可能涵盖你想知道的C++的一切知识,因为不同的程序员和不同的应用程序需要不同的知识。因此,任何一本覆盖C++所有知识的书籍,比如Stroustrup写的《The C++ Programming Language》(Addison-Wesley出版社,2000),都不可避免地告诉你很多你并不需要的知识。但是即便你不需要了解这些知识,还是有些人会有这个需要。
  另一方面,C++的许多部分非常重要,如果不理解它们,就很难有效地编写程序。我们会关注这些部分。仅使用本书的知识,就完全可以编写各种各样的实用程序。事实上,我们的一个审校,他也是C++编写的一个大型商业系统的主要程序员,他告诉我们,本书基本上覆盖了他们工作中使用到的所有技术。
  使用这些技术,你可以编写真正的C++程序,而不是C语言风格,或者其他语言风格的C++程序。一旦掌握了本书的内容,你就会知道还应该学习些什么知识以及如何来学习。外行的望远镜制造者们常常这样说,先制造一个3英寸的镜片,然后再制造一个6英寸的镜片,要比从头开始制造一个6英寸的镜片容易得多。
  本书讲述的仅仅是标准C++,并且忽略了其他扩展。这样做的好处是,我们教你编写的程序可以在任何环境下运行。然而,这也暗示了我们不会讲述如何编写在窗口环境下运行的程序,因为这样的程序总是与特定的环境,往往也与特定的厂商密切地联系在一起。如果你想编写只在特定环境下运行的程序,你就只能在其他地方学习这样的知识,但是千万不要因此就把本书抛弃!因为我们的方法是通用的,你可以把这里所学的所有知识用在任意的环境中。当然,你也应该尽量阅读GUI应用程序的书籍,但是请先阅读本书!
  给有经验的C或C++程序员的提示
  学习一种新的编程语言时,可能会不自觉地用已经了解的语言风格来编写程序。为了避免这种习惯,我们从一开始就使用C++标准库中的高级抽象。如果你是有经验的C或者C++程序员,这种方法对你来说,既有好消息,也有坏消息—其实都是同样的消息。
  这些消息就是,你会惊奇地发现,你已有的知识对理解我们所讲述的C++知识来说用处不大。你需要学习的东西远远超出你的意料(这就是坏消息),但是你会学得比预期快得多(这就是好消息)。特别地,如果你已经知道C++,那么你首先学的可能是C语言编程,也就是说你的C++编程风格是基于C语言的。这样做并没有什么错,但是我们的方法与众不同,我们相信你会看到你从未见过的C++的另一面。
当然,很多语法细节都是相似的,但是这仅仅是细节而已。对于重要的概念,我们会以完全不同的顺序来安排,这很可能是你以前从未见过的顺序。比如,我们到第10章才会讲述指针和数组,我们也并不讨论你的旧爱printf和malloc。另一方面,我们在第1章就会开始讲述标准库的string类。我们说我们会采用一种新的方法,这并没有言过其实!
  本书的结构
  本书分为两部分。第一部分是从开始到第7章,关注使用标准库抽象的程序。第二部分从第8章开始,讲述如何定义抽象。
  一开始就讲述标准库是与众不同的,但是我们认为这样做是正确的。C++语言的很多部分(尤其是比较难的部分)几乎都是为了库作者的利益来考虑的。库的使用者根本无须知道语言的这些部分。通过在开始忽略这些部分,直到第二部分才讲述这些内容,我们很快就可以编写实用的C++程序,这种方法比起通常的方法要快得多。
  一旦理解了如何使用标准库,就可以学习标准库所依赖的底层技术,并且可以使用这些技术来编写自己的库。另外,你会有一种感觉,知道如何使一个库有用,以及何时避免完全编写新的代码。
  虽然本书比很多C++书都要薄,但是我们对每个重要概念都至少使用了两次,关键概念更是不断使用。这样使得本书的很多地方都会引用其他内容。我们所采用的形式类似第3.1小节,表示参见第3.1节的内容。当我们第一次解释某个概念时,我们会用黑体来表示,这样做会使得它比较明显,并且可以让你注意到它是一个重点。
本书每章(除了最后一个章)结束的时候都有一个小结。小结有两个用处:可以让你加深对本章所介绍的概念的印象,并且小结还包含了其他相关的一些知识,我们认为你迟早需要了解这些知识。我们建议你第一次阅读本书的时候跳过这些内容,在以后需要的时候再回头来看。
  两个附录详细总结并说明了C++语言和标准库的重要部分,希望对于编写程序会有一定的帮助。
  发挥本书的最大功效
  每本讲述编程的书籍都会包含示例程序,本书也是如此。为了理解这些程序是如何工作的,就需要在计算机上运行它们。这样的计算机非常多,新的计算机也在不断地出现—也就是说,直到你读到这句话为止,我们所说的任何关于它们的东西都是不精确的。因此,如果还不知道如何编译并执行一个C++程序的话,请访问http://www.acceleratedcpp.com,看看我们在那里是如何说的。我们会随时更新这个网站,为它添加运行C++程序的信息和建议。这个网站也提供了机器可读的一些示例程序版本,以及其他一些你可能会感兴趣的信息。
  感谢
  我们谨以此感谢下面的人们,没有他们就不可能有这本书。本书的审校对本书功不可没:Robert Berger,Dag Br焎k,Adam Buchsbaum,Stephen Clamage,Jon Kalb,Jeffrey Oldham,David Slayton,Bjarne Stroustrup,Albert Tenbusch,Bruce Tetelman和Clovis Tondo。Addison-Wesley出版社的很多人也参与了本书的出版工作;我们所知道的有Tyrrell Albaugh, Bunny Ames,Mike Hendrickson, Deborah Lafferty, Cathy Ohala和Simone Payment。Alexander Tsiris核对了第13.2.2节中的希腊语语源。最后,从高级程序开始教授C++的想法已经酝酿了好多年,这也是受到听过我们课程的成百上千的学生和数以万计的参与我们讨论的人们的激励而产生的。

  Andrew Koenig
  Barbara E. Moo
  Gillette, New Jersey
  2000年6月

封底文字

C++之父倍加推崇的C++教材 Francis Glassborow的《C++编程你也行》和Koenig & Moo的《Accelerated C++》是打破旧式而令人厌烦的教育方式的例子。 ——C++之父Bjarne Stroustrup 为什么本书给人的印象会如此深刻呢?这是因为: ● 一开始就介绍那些最有用的概念,而不是那些简单的注释;读者很快就能够以此开始编程; ● 描述现实中的问题和解决方案,而不是单纯的语言特性;读者不但学习到了这些特性,而且还知道如何把它们应用到程序中去。 ● 涵盖了语言本身和标准库;读者可以从一开始就使用标准库来编写自己的程序。 作者通过在美国斯坦福大学的教学经验证明了这种方法的有效性—在那里,学生们在编程语言第一堂课中就学习到了如何编写真实的程序。 不管你是一个渴望开始学习C++编程的新手,还是一个已经使用C++多年并对它有了很深了解的老手,本书作者独特的教学方法和经验都使得本书应该成为你书架中不可缺少的一员。

作者简介

Andrew Koenig;Barbara E. Moo:Andrew Koenig:  AT&T大规模程序研发部 (前贝尔实验室) 成员。他从1986年开始从事C语言的研究,1977年加入贝尔实验室。在1989年ISO/ANSI C++委员会成立时,他就加入了该委员会,并一直担任项目编辑。他还是《Ruminations on C++》 (C++沉思录) 、《C Traps and Pitfalls》的作者。
Barbara E. Moo: 现任AT&T网络体系结构部门负责人。在1983年加入贝尔实验室不久,她就开始从事Fortran 77编译器的研究工作,这是第一个用C++编写的商业产品。她一直负责AT&T的C++编译器项目。她和丈夫Andrew Koenig合作编写了《Ruminations on C++》。

译者简介

靳志伟:暂无简介

译者序

进入大学学习编程,开始接触的语言是C语言,有了C语言的基础后,慢慢地过渡到C++语言。这个过程是很多人都走过的,也总以为是最自然的过程。但是当我翻开《Accelerated C++: Practical Programming by Example》时,顿时感到焕然一新:很少有C++的基础读物以如此顺序来编排,更难能可贵的是,这样的顺序安排得是那样自然,一气呵成。
  在翻译本书的过程中,我越来越深地体会到这本书章节之间安排的巧妙:它从使用C++标准库中的高级抽象开始,可以让你很快地进入编程的状态,开门见山,而非曲径通幽。毕竟枯涩的曲径往往会消磨掉人的兴趣和意志。同时,我更加感到这本书的内容设计的精致—每一章都有很经典独特的例子以及非常到位的讲解。正因为如此,才使大多数人认为枯燥晦涩,甚至难以驾驭的C++变得生动有趣,条理清晰。也难怪本书会成为斯坦福大学的经典C++教材。
  Andrew Koenig和Barbara E. Moo夫妇有着多年的C++开发、研究和教学经验,还亲身参与了C++的变革和演进的工作,在C++领域,他们是相当有影响力的人。正因为如此,本书讲解得通俗易懂,既像老师的循循善诱,又像是亲密朋友的指点与支持。翻译的过程也是我重新学习的过程,本书覆盖了C++中非常多的内容,从标准库容器、泛型算法的使用,到类的设计、泛型算法的设计,本书都进行了详细的讲解。而且,本书所讲述的是标准C++,无论你使用的是什么样的系统,本书都适用。
  最后,谨以此感谢Andrew Koenig和Barbara E. Moo这一对“神雕侠侣”,正是因为他们的工作才有了本书的传奇问世。感谢北京师范大学的陈硕,同济大学软件学院的周闻钧老师,是他们给我很多翻译细节上的指点;感谢北京邮电大学的所有老师和同学为我营造的良好的翻译环境。因为你们,我才可以走到现在!
  参加本书翻译的有靳志伟、何官卿、李大伟和姚海鹏。翻译过程中难免会有疏漏,如果读者有任何疑问,可以与我联系,希望在交流的过程中,大家共同进步!我的邮箱:jinzita177@gmail.com。

  靳志伟
  于北京
  2007年7月1日

图书目录

目   录“C++设计新思维”丛书前言
译者序
前 言

第0章 入门 1
0.1 注释 1
0.2 #include指令 1
0.3 main函数 2
0.4 花括号 2
0.5 使用标准库来输出 2
0.6 return语句 3
0.7 稍微深入分析“Hello, world!”程序 3
小结 4
练习 6
第1章 使用字符串 7
1.1 输入 7
1.2 为名字装框输出 9
小结 12
练习 12
第2章 循环和计数 14
2.1 问题 14
2.2 程序的总体结构 14
2.3 输出任意多行 15
2.3.1 while语句 16
2.3.2 设计一个while语句 16
2.4 输出一行 18
2.4.1 输出边界字符 19
2.4.2 输出非边界字符 21
2.5 完整的框架程序 22
2.5.1 简化重复的std:: 22
2.5.2 使用for语句来简化 23
2.5.3 精简测试 24
2.5.4 整合结果 24
2.6 计数 25
小结 27
练习 29
第3章 使用批量数据 30
3.1 计算学生成绩 30
3.1.1 检测输入的结束 33
3.1.2 循环不变式 34
3.2 使用中值取代平均值 35
3.2.1 用vector保存数据集 35
3.2.2 生成输出 37
3.2.3 值得注意的地方 40
小结 41
练习 42
第4章 组织程序和数据 43
4.1 组织计算 43
4.1.1 查找中值 44
4.1.2 重新实现计算最终成绩的方法 45
4.1.3 读取家庭作业成绩 47
4.1.4 3种函数形参 49
4.1.5 使用函数来计算学生的成绩 50
4.2 组织数据 52
4.2.1 把一个学生的所有数据集合起来 52
4.2.2 处理学生记录 53
4.2.3 生成报表 55
4.3 把各部分程序连接起来 56
4.4 把计算成绩程序分块 58
4.5 修改后的计算成绩程序 60
小结 61
练习 62
第5章 使用序列式容器并分析字符串 64
5.1 把学生分类 64
5.1.1 就地删除元素 65
5.1.2 顺序访问和随机访问 67
5.2 迭代器 67
5.2.1 迭代器类型 68
5.2.2 迭代器操作 69
5.2.3 一些语法知识 70
5.2.4 students.erase(students.begin()+i)
的含义 70
5.3 使用迭代器取代索引 70
5.4 重新设计数据结构以获取更好的性能 72
5.5 list类型 72
5.5.1 重要的区别 73
5.5.2 为什么要如此麻烦呢 74
5.6 剖析字符串 74
5.7 检测split函数 77
5.8 连接字符串 78
5.8.1 为一个图案装框 78
5.8.2 纵向连接 80
5.8.3 横向连接 81
小结 82
练习 85
第6章 使用库算法 87
6.1 分析字符串 87
6.1.1 分割字符串的另一种方式 89
6.1.2 回文 90
6.1.3 查找URL 91
6.2 比较计算学生成绩的方案 95
6.2.1 处理学生记录 95
6.2.2 分析成绩 96
6.2.3 基于家庭作业成绩的平均值
来计算最终成绩 99
6.2.4 已提交的家庭作业成绩的中值 100
6.3 把学生分类并且重新解决一个问题 101
6.3.1 访问两次的解决方案 101
6.3.2 一次访问的解决方案 103
6.4 算法、容器和迭代器 104
小结 104
练习 106
第7章 使用关联式容器 107
7.1 支持高效查找的容器 107
7.2 字数统计程序 108
7.3 生成一个交叉引用表 109
7.4 生成句子 112
7.4.1 表示规则 113
7.4.2 读取语法 114
7.4.3 生成一个随机的句子 115
7.4.4 选取一个随机元素 117
7.5 注意性能 119
小结 119
练习 120
第8章 编写泛型函数 122
8.1 什么是泛型函数 122
8.1.1 未知类型的中值 123
8.1.2 模板实例化 124
8.1.3 泛型函数和类型 125
8.2 数据结构的独立 126
8.2.1 算法和迭代器 127
8.2.2 顺序只读访问 127
8.2.3 顺序只写访问 128
8.2.4 顺序读写访问 129
8.2.5 可逆访问 130
8.2.6 随机访问 130
8.2.7 迭代器区间和越界值 131
8.3 输入和输出迭代器 132
8.4 使用迭代器来提高灵活性 133
小结 134
练习 135
第9章 定义新类型 137
9.1 回顾Student_info 137
9.2 类 138
9.2.1 成员函数 138
9.2.2 非成员函数 141
9.3 保护 141
9.3.1 访问器函数 142
9.3.2 检测对象是否为空 144
9.4 Student_info类 144
9.5 构造函数 145
9.5.1 默认构造函数 146
9.5.2 带有参数的构造函数 147
9.6 使用Student_info类 147
小结 148
练习 149
第10章 管理内存和底层数据结构 150
10.1 指针和数组 150
10.1.1 指针 151
10.1.2 指向函数的指针 152
10.1.3 数组 154
10.1.4 指针的算术运算 155
10.1.5 索引 156
10.1.6 数组初始化 156
10.2 再看字符串直接量 157
10.3 初始化字符指针数组 158
10.4 main函数的参数 159
10.5 读写文件 160
10.5.1 标准错误流 160
10.5.2 处理多个输入和输出文件 160
10.6 3种内存管理 162
10.6.1 为一个对象分配和释放内存 163
10.6.2 为数组分配并释放内存 163
小结 165
练习 166
第11章 定义抽象数据类型 167
11.1 Vec类 167
11.2 实现Vec类 167
11.2.1 内存分配 169
11.2.2 构造函数 169
11.2.3 类型定义 170
11.2.4 索引和大小 172
11.2.5 返回迭代器的操作 173
11.3 复制控制 174
11.3.1 复制构造函数 174
11.3.2 赋值 175
11.3.3 赋值不是初始化 177
11.3.4 析构函数 179
11.3.5 默认操作 179
11.3.6 三者缺一不可的规则 180
11.4 动态Vec对象 181
11.5 灵活的内存管理 182
小结 187
练习 188
第12章 使类的对象像数值一样工作 189
12.1 一个简单的string类 189
12.2 自动转换 191
12.3 Str类的操作 192
12.3.1 输入-输出操作符 192
12.3.2 友元 193
12.3.3 其他二元操作符 195
12.3.4 混合类型的表达式 196
12.3.5 定义二元操作符 197
12.4 某些类型转换是危险的 198
12.5 类型转换操作符 199
12.6 类型转换和内存管理 200
小结 202
练习 202
第13章 使用继承和动态绑定 204
13.1 继承 204
13.1.1 保护标签 205
13.1.2 操作 206
13.1.3 继承和构造函数 207
13.2 多态和虚函数 209
13.2.1 不知道对象类型的情况下
取得对象的值 210
13.2.2 动态绑定 211
13.2.3 回顾 212
13.3 使用继承来解决我们的问题 213
13.3.1 包含(实质上)未知类型的容器 215
13.3.2 虚析构函数 217
13.4 一个简单的句柄类 218
13.4.1 读取句柄 220
13.4.2 复制句柄对象 221
13.5 使用句柄类 222
13.6 精妙之处 223
13.6.1 继承和容器 223
13.6.2 我们需要的是哪个函数 224
小结 225
练习 226
第14章 几乎自动的管理内存 228
14.1 复制所指向的对象的句柄 228
14.1.1 一个泛型句柄类 229
14.1.2 使用一个泛型句柄 232
14.2 引用计数句柄 234
14.3 可以决定何时共享数据的句柄 236
14.4 可控制句柄上的一个改进 238
14.4.1 复制不能控制的类型 239
14.4.2 什么时候需要进行复制 241
小结 241
练习 241
第15章 再看字符图形问题 242
15.1 设计 242
15.1.1 使用继承来模拟这种结构 243
15.1.2 Pic_base类 245
15.1.3 派生类 247
15.1.4 复制控制 249
15.2 实现 250
15.2.1 实现用户接口 250
15.2.2 String_Pic类 252
15.2.3 填充输出以补齐 254
15.2.4 VCat_Pic类 255
15.2.5 HCat_Pic类 256
15.2.6 Frame_Pic类 256
15.2.7 不要忘记友元声明 257
小结 259
练习 260
第16章 如何学习C++ 261
16.1 使用已经掌握的知识 261
16.2 学习更多的知识 263
练习 263
附录A 语言细节 264
附录B 标准库概要 279

教学资源推荐
作者: Y. Daniel Liang
作者: [美]基普·R. 欧文(Kip R. Irvine) 著
作者: Richard C. Detmer
作者: 刘海燕 荆涛 主编 王子强 武卉明 杨健康 周睿 编著
参考读物推荐
作者: 廖世恩 许宏送
作者: (美)马丁 L. 阿伯特(Martin L. Abbott)  迈克尔 T. 费舍尔(Michael T. Fisher) 著
作者: [美]帕维尔·约西福维奇(Pavel Yosifovich) 著