深入理解C++11:C++11新特性解析与应用(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-08 03:52:08

点击下载

作者:MichaelWong

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

深入理解C++11:C++11新特性解析与应用

深入理解C++11:C++11新特性解析与应用试读:

前言

为什么要写这本书

相比其他语言的频繁更新,C++语言标准已经有十多年没有真正更新过了。而上一次标准制定,正是面向对象概念开始盛行的时候。较之基于过程的编程语言,基于面向对象、泛型编程等概念的C++无疑是非常先进的,而C++98标准的制定以及各种符合标准的编译器的出现,又在客观上推动了编程方法的革命。因此在接下来的很多年中,似乎人人都在学习并使用C++。商业公司在邀请C++专家为程序员讲课,学校里老师在为学生绘声绘色地讲解面向对象编程,C++的书籍市场也是百花齐放,论坛、BBS的C++板块则充斥了大量各种关于C++的讨论。随之而来的,招聘启事写着“要求熟悉C++编程”,派生与继承成为了面试官审视毕业生基础知识的重点。凡此种种,不一而足。于是C++语言“病毒性”地蔓延到各种编程环境,成为了使用最为广泛的编程语言之一。

十来年的时光转瞬飞逝,各种编程语言也在快马加鞭地向前发展。如今流行的编程语言几乎无一不支持面向对象的概念。即使是古老的语言,也通过了制定新标准,开始支持面向对象编程。随着Web开发、移动开发逐渐盛行,一些新流行起来的编程语言,由于在应用的快速开发、调试、部署上有着独特的优势,逐渐成为了这些新领域中的主流。不过这并不意味着C++正在失去其阵地。身为C的“后裔”,C++继承了C能够进行底层操作的特性,因此,使用C/C++编写的程序往往具有更佳的运行时性能。在构建包括操作系统的各种软件层,以及构建一些对性能要求较高的应用程序时,C/C++往往是最佳选择。更一般地讲,即使是由其他语言编写的程序,往往也离不开由C/C++编写的编译器、运行库、操作系统,或者虚拟机等提供支持。因此,C++已然成为了编程技术中的中流砥柱。如果用个比喻来形容C++,那么可以说这十来年C++正是由“锋芒毕露”的青年时期走向“成熟稳重”的中年时期。

不过十来年对于编程语言来说也是个很长的时间,长时间的沉寂甚至会让有的人认为,C++就是这样一种语言:特性稳定,性能出色,易于学习而难于精通。长时间使用C++的程序员也都熟悉了C++毛孔里每一个特性,甚至是现实上的一些细微的区别,比如各种编译器对C++扩展的区别,也都熟稔于心。于是这个时候,C++11标准的横空出世,以及C++之父Bjarne Stroustrup的一句“看起来像一门新语言”的说法,无疑让很多C++程序员有些诚惶诚恐:C++11是否又带来了编程思维的革命?C++11是否保持了对C++98及C的兼容?旧有的C++程序到了C++11是否需要被推倒重来?

事实上这些担心都是多余的。相比于C++98带来的面向对象的革命性,C++11带来的却并非“翻天覆地”式的改变。很多时候,程序员保持着“C++98式”的观点来看待C++11代码也同样是合理的。因为在编程思想上,C++11依然遵从了一贯的面向对象的思想,并深入加强了泛型编程的支持。从我们的观察来看,C++11更多的是对步入“成熟稳重”的中年时期的C++的一种改造。比如,像auto类型推导这样的新特性,展现出的是语言的亲和力;而右值引用、移动语义的特性,则着重于改变一些使用C++程序库时容易发生的性能不佳的状况。当然,C++11中也有局部的创新,比如lambda函数的引入,以及原子类型的设计等,都体现了语言与时俱进的活力。语言的诸多方面都在C++11中再次被锤炼,从而变得更加合理、更加条理清晰、更加易用。C++11对C++语言改进的每一点,都呈现出了经过长时间技术沉淀的编程语言的特色与风采。所以从这个角度上看,学习C++11与C++98在思想上是一脉相承的,程序员可以用较小的代价对C++的知识进行更新换代。而在现实中,只要修改少量已有代码(甚至不修改),就可以使用C++11编译器对旧有代码进行升级编译而获得新标准带来的好处,这也非常具有实用性。因此,从很多方面来看,C++程序员都应该乐于升级换代已有的知识,而学习及使用C++11也正是大势所趋。

在本书开始编写的时候,C++11标准刚刚发布一年,而本书出版的时候,C++11也只不过才诞生了两年。这一两年,各个编译器厂商或者组织都将支持C++11新特性作为了一项重要工作。不过由于C++11的语言特性非常的多,因此本书在接近完成时,依然没有一款编译器支持C++11所有的新特性。但从从业者的角度看,C++11迟早会普及,也迟早会成为C++程序员的首选,因此即使现阶段编译器对C++新特性的支持还不充分,但还是有必要在这个时机推出一本全面介绍C++11新特性的中文图书。希望通过这样的图书,使得更多的中国程序员能够最快地了解C++11新语言标准的方方面面,并且使用最新的C++11编译器来从各方面提升自己编写的C++程序。

读者对象

本书针对的对象是已经学习过C++,并想进一步学习、了解C++11的程序员。这里我们假定读者已经具备了基本的C++编程知识,并掌握了一定的C++编程技巧(对于C++的初学者来说,本书阅读起来会有一定的难度)。通过本书,读者可以全面而详细地了解C++11对C++进行的改造。无论是试图进行更加精细的面向对象程序编写,或是更加容易地进行泛型编程,或是更加轻松地改造使用程序库等,读者都会发现C++11提供了更好的支持。

本书作者和书籍支持

本书的作者都是编译器行业的从业者,主要来自于IBM XL编译器中国开发团队。IBM XL编译器中国开发团队创立于2010年,拥有编译器前端、后端、性能分析、测试等各方面的人员,工作职责涵盖了IBM XL C/C++及IBM XL Fortran编译器的开发、测试、发布等与编译器产品相关的方方面面。虽然团队成立时间不长,成员却都拥有比较丰富的编译器开发经验,对C++11的新特性也有较好的理解。此外,IBM北美编译器团队成员Michael(他是C++标准委员会的成员)也参加了本书的编写工作。在书籍的编写上,Michael为本书拟定了提纲、确定了章节主题,并直接编写了本书的首章。其余作者则分别对C++11各种新特性进行了详细研究讨论,并完成了书稿其余各章的撰写工作。在书稿完成后,除了请Michael为本书的部分章节进行了审阅并提出修改意见外,我们又邀请了IBM中国信息开发部及IBM北京编译器团队的一些成员对本书进行了详细的审阅。虽然在书籍的策划、编写、审阅上我们群策群力,尽了最大的努力,以保证书稿质量,不过由于C++11标准发布时间不长,理解上的偏差在所难免,因此本书也可能在特性描述中存在一些不尽如人意或者错误的地方,希望读者、同行等一一为我们指出纠正。我们也会通过博客(http://ibm.co/HK0GCx)、微博(www.weibo.com/ibmcompiler)发布与本书相关的所有信息,并与本书读者共同讨论、进步。

如何阅读本书

读者在书籍阅读中可能会发现,本书的一些章节对C++基础知识要求较高,而某些特性很可能很难应用于自己的编程实践。这样的情况应该并不少见,但这并不是这门语言缺乏亲和力,或是读者缺失了背景知识,这诚然是由于C++的高成熟度导致的。在C++11中,不少新特性都会局限于一些应用场景,比如说库的编写,而编写库却通常不是每个程序员必须的任务。为了避免这样的状况,本书第1章对C++11的语言新特性进行了分类,因此读者可以选择按需阅读,对不想了解的部分予以略过。一些本书的使用约定,读者也可以在第1章中找到。

致谢

在这里我们要对IBM中国信息开发部的陈晶(作者之一)、卢昉、付琳,以及IBM北京编译器团队的冯威、许小羽、王颖对本书书稿详尽细致的审阅表示感谢,同时也对他们专业的工作素养表示由衷的钦佩。此外,我们也要感谢IBM XL编译器中国开发团队的舒蓓、张嗣元两位经理在本书编写过程中给予的大力支持。而IBM图书社区的刘慎峰及华章图书的杨福川编辑的辛勤工作则保证了本书的顺利出版,在这里我们也要对他们以及负责初审工作的孙海亮编辑说声谢谢。此外,我们还要感谢各位作者的家人在书籍编写过程中给予作者的体谅与支持。最后要感谢的是本书的读者,感谢你们对本书的支持,希望通过这本书,我们能够一起进入C++编程的新时代。IBM XL编译器中国开发团队第1章新标准的诞生

从最初的代号C++0x到最终的名称C++11,C++的第二个真正意义上的标准姗姗来迟。可以想象,这个迟来的标准必定遭遇了许多的困难,而C++标准委员会应对这些困难的种种策略,则构成新的C++语言基因,我们可以从新的C++11标准中逐一体会。而客观上,这些基因也决定了C++11新特性的应用范畴。在本章中,我们会从设计思维和应用范畴两个维度对所有的C++11新特性进行分类,并依据这种分类对一些特性进行简单的介绍,从而一览C++11的全景。1.1 曙光:C++11标准的诞生1.1.1 C++11/C++0x(以及C11/C1x)—新标准诞生

2011年11月,在印第安纳州布卢明顿市,“八月印第安纳大学会议”(August Indiana University Meeting)缓缓落下帷幕。这次会议的结束,意味着长久以来以C++0x为代号的C++11标准终于被C++标准委员会批准通过。至此,C++新标准尘埃落定。从C++98标准通过的时间开始计算,C++标准委员会,即WG21,已经为新标准工作了11年多的时间。对于一个编程语言标准而言,11年显然是个非常长的时间。其间我们目睹了面向对象编程的盛极,也见证了泛型编程的风起云涌,还见证了C++后各种新的流行编程语言的诞生。不过在新世纪第二个10年的伊始,C++的标准终于二次来袭。

事实上,在2003年WG21曾经提交了一份技术勘误表(Technical Corrigendum,简称TC1)。这次修订使得C++03这个名字已经取代了C++98成为C++11之前的最新C++标准名称。不过由于TC1主要是对C++98标准中的漏洞进行修复,核心语言规则部分则没有改动,因此,人们还是习惯地把两个标准合称为C++98/03标准。

注意 在本书中,但凡是C++98和C++03标准没有差异时,我们都会沿用C++98/03这样的俗称,或者直接简写为C++98。如果涉及TC1中所提出的微小区别,我们会使用C++98和C++03来分别指代两种C++标准。

C++11是一种新语言的开端。虽然设计C++11的目的是为了要取代C++98/03,不过相比于C++03标准,C++11则带来了数量可观的变化,这包括了约140个新特性,以及对C++03标准中约600个缺陷的修正。因此,从这个角度看来C++11更像是从C++98/03中孕育出的一种新语言。正如当年C++98/03为C++引入了如异常处理、模板等许多让人耳目一新的新特性一样,C++11也通过大量新特性的引入,让C++的面貌焕然一新。这些全新的特性以及相应的全新的概念,都是我们要在本书中详细描述的。1.1.2 什么是C++11/C++0x

C++0x是WG21计划取代C++98/03的新标准代号。这个代号还是在2003年的时候取的。当时委员会乐观地估计,新标准会在21世纪的第一个10年内完成。从当时看毕竟还有6年的时间,确实无论如何也该好了。不过2010新年钟声敲响的时候,WG21内部却还在为一些诸如哪些特性该放弃,哪些特性该被削减的议题而争论。于是所有人只好接受这个令人沮丧的事实:新标准没能准时发布。好在委员会成员保持着乐观的情绪,还常常相互开玩笑说,x不是一个0到9的十进制数,而应该是一个十六进制数,我们还可以有A、B、C、D、E、F。虽然这是个玩笑,但也有点认真的意思,如果需要,WG21会再使用“额外”的6年,在2015年之前完成标准。不过众所周知的,WG21“只”再花了两年时间就完成了C++11标准。

注意 C语言标准委员会(C committee)WG14也几乎在同时开始致力于取代C99标准。不过相比于WG21,WG14对标准完成的预期更加现实。因为他们使用的代号是C1x,这样新的C标准完成的最后期限将是2019年。事实上WG14并没用那么长时间,他们最终在2011年通过了提案,也就是C11标准。

从表1-1中可以看到C++从诞生到最新通过的C++11标准的编年史。表1-1 C++发展编年史

注意 语言标准的发布通常有两种—规范的(Normative)及不规范的(Non-normative)。前者表示内容通过了批准(ratified),因此是正式的标准,而后者则不是。不过不规范的发布通常是有积极意义的,比方说TR1,它就是不规范的标准,但是后来很多TR1的内容都成为了C++11标准的一部分。

图1-1比较了两个语言标准委员会(WG21,WG14)制定新标准的工作进程,其中一些重要时间点都标注了出来。图1-1 WG21和WG14制定新语言标准的工作进程1.1.3 新C++语言的设计目标

如果读者已经学习过C++98/03,就可以发现C++98/03的设计目标如下:

·比C语言更适合系统编程(且与C语言兼容)。

·支持数据抽象。

·支持面向对象编程。

·支持泛型编程。

这些特点使得面向对象编程和泛型编程在过去的10~20年内成为编程界的明星。不过从那时开始,C++的发展就不仅仅是靠学者的远见前瞻去推动的,有时也会借由一些“奇缘”而演进。比方说,C++模板就是这样一个“奇缘”。它使得C++近乎成为了一种函数式编程语言,而且还使得C++程序员拥有了模板元编程的能力。但是凡事有两面,C++98/03中的一些较为激进的特性,比如说动态异常处理、输出模板,现在回顾起来则是不太需要的。当然,这是由于我们有了“后见之明”,或者由于这些特性在新情况下不再适用,又或者它们影响了C++11的新特性的设计。因此一部分这样的特性已经被C++11弃用了。在附录B中我们会一一列出这些弃用的特性,并分析其被弃用的原因。

而C++11的整体设计目标如下:

·使得C++成为更好的适用于系统开发及库开发的语言。

·使得C++成为更易于教学的语言(语法更加一致化和简单化)。

·保证语言的稳定性,以及和C++03及C语言的兼容性。

我们可以分别解释一下。

首先,使C++成为更好的适用于系统开发及库开发的语言,意味着标准并不只是注重为某些特定的领域提供专业化功能,比如专门为Windows开发提供设计,或者专门为数值计算提供设计。标准希望的是使C++能够对各种系统的编程都作出贡献。

其次,使得C++更易于教学,则意味着C++11修复了许多令程序员不安的语言“毒瘤”。这样一来,C++语法显得更加一致化,新手使用起来也更容易上手,而且有了更好的语法保障。其实语言复杂也有复杂的好处,比如ROOTS、DEALII等一些复杂科学运算的算法,它们的作者非常喜爱泛型编程带来的灵活性,于是C++语言最复杂的部分正好满足了他们的需求。但是在这个世界上,新手总是远多于专家。而即使是专家,也常常只是精通自己的领域。因此语言不应该复杂到影响人们的学习。本书作者之一也是WG21中的一员,从结果上看,无论读者怎么看待C++11,委员会大多数人都认同C++11达成了易于教学这个目标(即使其中还存在着些看似严重的小缺陷)。

最后,则是语言的稳定性。经验告诉我们,伟大的编程语言能够长期存活下来的原因还是因为语言的设计突出了实用性。事实上,在标准制定过程中,委员会承担了很多压力,这些压力源自于大家对加入更多语言特性的期盼—每一个人都希望将其他编程语言中自己喜欢的特性加入到新的C++中。对于这些热烈而有些许盲目的期盼,委员会成员在Bjarne Stroustrup教授的引导下,选择了不断将许多无关的特性排除在外。其目的是防止C++成为一个千头万绪的但功能互不关联的语言。而如同现在看到的那样,C++11并非大而无序,相反地,许多特性可以良好地协作,进而达到“1+1>2”的效果。可以说,有了这些努力,今天的读者才能够使用稳定而强大的C++11,而不用担心语言本身存在着混乱状况甚至是冲突。

值得一提的是,虽然在取舍新语言特性方面标准委员会曾面临过巨大压力,但与此同时,标准委员会却没有收集到足够丰富的库的新特性。作为一种通用型语言,C++是否是成功,通常会依赖于不同领域中C++的使用情况,比如科学计算、游戏、制造业、网络编程等。在C++11通过的标准库中,服务于各个领域的新特性确实还是太少了。因此很有可能在下一个版本的C++标准制定中,如何标准化地使用库将成为热门话题,标准委员会也准备好了接受来自这方面的压力。1.2 今时今日的C++1.2.1 C++的江湖地位

如今C++依旧位列通用编程语言三甲,不过似乎没有以前那么流行了。事实上,编程语言排名通常非常难以衡量。比如,某位教授或学生用了C++来教授课程应该被计算在内吗?在新的联合攻击战斗机(Joint Strike Fighter,JSF-35)的航空电子设备中使用了C++编程应该计算在内吗?又或者C++被用于一款流行的智能手机操作系统的编程中算不算呢?再或者是C++被用于编写最流行的在线付费搜索引擎,或用于构建一款热门的第一人称射击游戏的引擎,或用于构建最热门的社交网络的代码库,这些都该计算在内吗?事实上,据我们所知,以上种种都使用了C++编程。而且在构建致力于沟通软硬件的系统编程中,C++也常常是必不可少的。甚至,C++还常用于设计和编写编程语言。因此我们可以认为,编程语言价值的衡量标准应该包括数量、新颖性、质量,以及以上种种,都应该纳入“考核”。这样一来,结论就很明显了:C++无处不在。1.2.2 C++11语言变化的领域

如果谁说C++11只是对C++语言做了大幅度的改进,那么他很可能就错过了C++11精彩的地方。事实上,读罢本书后,读者只需要看一眼代码,就可以说出代码究竟是C++98/03的,还是C++11的。C++11为程序员创造了很多更有效、更便捷的代码编写方式,程序员可以用简短的代码来完成C++98/03中同样的功能,简单到你惊呼“天哪,怎么能这么简单”。从一些简单的数据统计上看,比起C++98/03,C++11大大缩短了代码编写量,依情况最多可以将代码缩短30%~80%。

那么C++11相对于C++98/03有哪些显著的增强呢?事实上,这包括以下几点:

·通过内存模型、线程、原子操作等来支持本地并行编程(Native Concurrency)。

·通过统一初始化表达式、auto、declytype、移动语义等来统一对泛型编程的支持。

·通过constexpr、POD(概念)等更好地支持系统编程。

·通过内联命名空间、继承构造函数和右值引用等,以更好地支持库的构建。

表1-2列出了C++11批准通过的,且本书将要涉及的语言特性。这是一张相当长的表,而且一个个陌生的词汇足以让新手不知所措。不过现在还不是了解它们的时候。但看过这张表,读者至少会有这样一种感觉:C++11的确像是一门新的语言。如果我们将C++98/03标准中的特性和C++11放到一起,C++11则像是个恐怖的“编程语言范型联盟”。利用它不仅仅可以写出面向对象语言的代码,也可以写出过程式编程语言代码、泛型编程语言代码、函数式编程语言代码、元编程编程语言代码,或者其他。多范型的支持使得C++11语言的“硬能力”几乎在编程语言中“无出其右”。表1-2 C++11主要的新语言特性(中英文对照)

而从另一个角度看,编程中程序员往往需要将实物、流程、概念等进行抽象描述。但通常情况下,程序员需要抽象出的不仅仅是对象,还有一些其他的概念,比如类型、类型的类型、算法,甚至是资源的生命周期,这些实际上都是C++语言可以描述的。在C++11中,这些抽象概念常常被实现在库中,其使用将比在C++98/03中更加方便,更加好用。从这个角度上讲,C++11则是一种所谓的“轻量级抽象编程语言”(Lightweight Abstraction Programming Language)。其好处就是程序员可以将程序设计的重点更多地放在设计、实现,以及各种抽象概念的运用上。

总的来说,灵活的静态类型、小的抽象概念、绝佳的时间与空间运行性能,以及与硬件紧密结合工作的能力都是C++11突出的亮点。而反观C++98/03,其最强大的能力则可能是体现在能够构建软件基础架构,或构建资源受限及资源不受限的项目上。因此,C++11也是C++在编程语言领域上一次“泛化”与进步。

要实现表1-2中的各种特性,需要编译器完成大量的工作。对于大多数编译器供应商来说,只能分阶段地发布若干个编译版本,逐步支持所有特性(罗马从来就不是一天建成的,对吧)。大多数编译器已经开始了对C++11特性的支持。有3款编译器甚至从2008年前就开始支持C++11了:IBM的XL C/C++编译器从版本10.1开始。GNU的GCC编译器从版本4.3开始,英特尔编译器从版本10.1开始。而微软则从Visual Studio 2010开始。最近,苹果的clang/llvm编译器也从2010年的版本2.8开始支持C++11新特性,并且急速追赶其他编译器供应商。在本书附录C中,读者可以找到现在情况下各种编译器对C++11的支持情况。1.3 C++11特性的分类

从设计目标上说,能够让各个特性协同工作是设计C++11/0x中最为关键的部分。委员会总希望通过特性协作取得整体大于个体的效果,但这也是语言设计过程中最困难的一点。因此相比于其他的各种考虑,WG21更专注于以下理念:

·保持语言的稳定性和兼容性(Maintain stability and compatibility)。

·更倾向于使用库而不是扩展语言来实现特性(Prefer libraries to language extensions)。

·更倾向于通用的而不是特殊的手段来实现特性(Prefer generality to specialization)。

·专家新手一概支持(Support both experts and novices)。

·增强类型的安全性(Increase type safety)。

·增强代码执行性能和操作硬件的能力(Improve performance

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载