- 内容提要
- 前言
- 第 1 章 预备知识
- 第 2 章 开始学习 C++
- 第 3 章 处理数据
- 第 4 章 复合类型
- 第 5 章 循环和关系表达式
- 第 6 章 分支语句和逻辑运算符
- 第 7 章 函数——C++的编程模块
- 第 8 章 函数探幽
- 第 9 章 内存模型和名称空间
- 第 10 章 对象和类
- 第 11 章 使用类
- 第 12 章 类和动态内存分配
- 第 13 章 类继承
- 第 14 章 C++中的代码重用
- 第 15 章 友元、异常和其他
- 第 16 章 string 类和标准模板库
- 第 17 章 输入、输出和文件
- 第 18 章 探讨 C++新标准
- 附录 A 计数系统
- 附录 B C++保留字
- 附录 C ASCII 字符集
- 附录 D 运算符优先级
- 附录 E 其他运算符
- 附录 F 模板类 string
- 附录 G 标准模板库方法和函数
- 附录 H 精选读物和网上资源
- 附录 I 转换为 ISO 标准 C++
- 附录 J 复习题答案
18.8 语言变化
计算机语言是如何成长和发展的呢?C++的使用范围足够广后,显然需要国际标准,并将其控制权交给标准委员会:最初是 ANSI 委员会,随后是 ISO/ANSI 联合委员会,当前是 ISO/IEC JTC1/SC22/WG21(C++标准委员会)。ISO 是国际标准组织,IEC 是国际电子技术委员会,JEC1 是前两家组织组建的联合技术委员会 1,SC22 是 JTC1 下属的编程语言委员会,而 WG21 是 SC22 下属的 C++工作小组。
委员会考虑缺陷报告和有关语言修改和扩展的提议,并试图达成一致。这个过程既繁琐又漫长,《The Dsign and Evolution of C++》(Stroustrup,Addison-Wesley,1994)介绍了这方面的一些情况。寻求一致的委员会沉闷而争议不断,可能不是鼓励创新的好方式,这也不是标准委员会应扮演的角色。
但就 C++而言,还有另一种变更的途径,那就是充满创意的 C++编程社区的直接行动。程序员无法不受羁绊地改进语言,但可创建有用的库。设计良好的库可改善语言的用途和功能,提高可靠性,让编程更容易、更有乐趣。库是在现有语言功能的基础上创建的,不需要额外的编译器支持。如果库是通过模板实现的,则可以头文件(文本文件)的方式分发。
一项这样的变革是 STL,它主要是 Alexander Stepanov 创建的,Hewlett-Packard 免费提供它。STL 在编程社区获得了巨大成功,成了第一个 ANSI/ISO 标准的候选内容。事实上,其设计影响新标准的其他方面。
18.8.1 Boost 项目
最近,Boost 库成了 C++编程的重要部分,给 C++11 带来了深远影响。Boost 项目发起于 1998 年,当时的 C++库工作小组主席 Beman Dawes 召集其他几位小组成员制定了一项计划,准备在标准委员会的框架外创建新库。该计划的基本理念是,创建一个充当开放论坛的网站,让人发布免费的 C++库。这个项目提供有关许可和编程实践的指南,并要求对提议的库进行同行审阅。其最终的成果是,一系列得到高度赞扬和广泛使用的库。这个项目提供了一个环境,让编程社区能够检验和评估编程理念以及提供反馈。
18.8.2 TR1
TR1(Technical Report 1)是 C++标准委员会的部分成员发起的一个项目,它是一个库扩展选集,这些扩展与 C++98 标准兼容,但不是必不可少的。这些扩展是下一个 C++标准的候选内容。TR1 库让 C++社区能够检验其组成部分的价值。当标准委员会将 TR1 的大部分内容融入 C++11 时,面对的是众所皆知且经过实践检验的库。
在 TR1 中,Boost 库占了很大一部分。这包括模板类 tuple 和 array、模板 bind 和 function、智能指针(对名称和实现做了一定的修改)、static_assert、regex 库和 random 库。另外,Boost 社区和 TR1 用户的经验也导致了实际的语言变更,如异常规范的摒弃和可变参数模板的添加,其中可变参数模板让 tuple 模板类和 function 模板的实现更好了。
18.8.3 使用 Boost
虽然在 C++11 中,可访问 Boost 开发的众多库,但还有很多其他的 Boost 库。例如,Conversion 库中的 lexical_cast 让您能够在数值和字符串类型之间进行简单地转换,其语法类似于 dynamic_cast:将模板参数指定为目标类型。程序清单 18.11 是一个简单示例。
程序清单 18.11 lexcast.cpp
下面是两次运行该程序的情况:
第二次运行的结果凸显了 lexical_cast 的局限性:它未能很好地控制浮点数的格式。为控制浮点数的格式,需要使用更精致的内核格式化工具,这在第 17 章讨论过。
还可以使用 lexical_cast 将字符串转换为数值。
显然,Boost 提供的功能比这里介绍的要多得多。例如,Any 库让您能够在 STL 容器中存储一系列不同类型的值和对象,方法是将 Any 模板用作各种值的包装器。Math 库在标准 math 库的基础上增加了数学函数。Filesystem 库让您编写的代码可在使用不同文件系统的平台之间移植。有关这个库以及如何将其加入到各种平台的更详细信息,请参阅 Boost 网站(www.boost.org)。另外,有些 C++编译器(如 Cygwin 编译器)还自带了 Boost 库。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论