前 言
为什么要写这本书
相比其他语言的频繁更新,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++程序。
IBM XL编译器中国开发团队
目 录
[第1章 新标准的诞生
1.1 曙光:C++11标准的诞生](https://yq.aliyun.com/articles/173855/)
1.1.1 C++11/C++0x(以及C11/C1x)—新标准诞生
1.1.2 什么是C++11/C++0x
1.1.3 新C++语言的设计目标
1.2 今时今日的C++
1.2.1 C++的江湖地位
1.2.2 C++11语言变化的领域
1.3 C++11特性的分类
1.4 C++特性一览
1.4.1 稳定性与兼容性之间的抉择
1.4.2 更倾向于使用库而不是扩展语言来实现特性
1.4.3 更倾向于通用的而不是特殊的手段来实现特性
1.4.4 专家新手一概支持
1.4.5 增强类型的安全性
1.4.6 与硬件紧密合作
1.4.7 开发能够改变人们思维方式的特性
1.4.8 融入编程现实
1.5 本书的约定
1.5.1 关于一些术语的翻译
1.5.2 关于代码中的注释
1.5.3 关于本书中的代码示例与实验平台
[第2章 保证稳定性和兼容性
2.1 保持与C99兼容](https://yq.aliyun.com/articles/173908/)
2.1.1 预定义宏
2.1.2 __func__预定义标识符
2.1.3 _Pragma操作符
2.1.4 变长参数的宏定义以及__VA_ARGS__
2.1.5 宽窄字符串的连接
2.2 long long整型
2.3 扩展的整型
2.4 宏__cplusplus
2.5 静态断言
2.5.1 断言:运行时与预处理时
2.5.2 静态断言与static_assert
2.6 noexcept修饰符与noexcept操作符
2.7 快速初始化成员变量
2.8 非静态成员的sizeof
2.9 扩展的friend语法
2.10 final/override控制
2.11 模板函数的默认模板参数
2.12 外部模板
2.12.1 为什么需要外部模板
2.12.2 显式的实例化与外部模板的声明
2.13 局部和匿名类型作模板实参
2.14 本章小结
[第3章 通用为本,专用为末
3.1 继承构造函数](https://yq.aliyun.com/articles/174016/)
3.2 委派构造函数
3.3 右值引用:移动语义和完美转发
3.3.1 指针成员与拷贝构造
3.3.2 移动语义
3.3.3 左值、右值与右值引用
3.3.4 std::move:强制转化为右值
3.3.5 移动语义的一些其他问题
3.3.6 完美转发
3.4 显式转换操作符