前言

为什么要写这本书

相比其他语言的频繁更新,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++程序。