35-让自己习惯于C++标准语言
第六章,杂项讨论
35-让自己习惯于C++标准语言
一、标准的重要意义
标准的重要意义在于它是权威参考。ISO/ANSI C++标准是编译器实现者查阅的文档,是作者准备书籍时检查的参考资料,也是程序员寻找C++问题权威答案的来源。
在标准化之前,C++语言的演变由编译器厂商主导。当某个厂商引入了一个语言特性,如果这个特性受欢迎,其他厂商就会跟进实现,这个特性也就成为语言事实上的标准。这种由厂商主导的方式带来了一些问题:
首先,编译器厂商通常比标准委员会更关注创新。为了吸引用户,厂商倾向于实现各种扩展功能,这些扩展虽然诱人,却可能导致程序难以移植到其他编译器上。标准委员会的职责是防止语言过度膨胀,确保C++在各种平台上的可移植性。
其次,标准委员会对语言变更持保守态度。他们只会在获得充分实践经验后才将新特性加入标准。这种谨慎态度虽然延缓了新特性进入官方标准的时间,但保证了标准的稳定性和可靠性。
第三,C++标准关注可移植性。标准委员会的首要目标之一是确保C++代码能够在不同平台间轻松移植。相比之下,编译器厂商则倾向于提供特定平台的优化和扩展,这虽然能提升性能,却牺牲了可移植性。
第四,标准委员会是辩论和妥协的场所。委员会成员来自不同背景,代表着各种利益群体。委员会内部经常就语言特性展开激烈辩论,最终的标准往往是各种观点妥协的结果。
二、标准库的主要组成部分
标准C++库包含多个重要组件,远超大多数程序员想象。
首先是标准C运行库的支持。这是C++对C语言兼容性的基础,包括C标准库中的所有函数,如输入输出、字符串处理、数学计算、内存管理等。C++程序可以无缝使用这些C库函数。
其次是string类型的支持。C++提供了 std::string 类,这是对C风格字符串的重大改进。 string 类封装了字符数组的操作,提供了更安全的内存管理、更便捷的字符串操作接口,以及丰富的成员函数。
第三是国际化和本地化支持。标准库提供了 locale 机制,用于处理不同国家和地区的字符编码、日期格式、货币符号、数字格式等差异。这使得编写国际化应用程序变得更加容易。
第四是I/O操作的支持。C++的I/O流库(iostream)提供了类型安全、可扩展的输入输出机制。包括标准输入输出流(cin、cout、cerr)、文件流(fstream)、字符串流(stringstream)等。
第五是数值计算的支持。标准库提供了复数类( complex )、数值数组( valarray )以及泛型数值算法,满足科学计算和工程应用的需求。
第六也是最重要的是容器与算法(STL)。标准模板库(Standard Template Library)是C++标准库的核心组成部分,提供了向量(vector)、列表(list)、双端队列(deque)、集合(set)、映射(map)等容器,以及排序、查找、遍历等通用算法。STL的设计理念是泛型编程,通过模板实现算法与数据结构的分离,大大提高了代码的复用性和效率。
三、如何熟悉标准
熟悉标准C++语言需要系统学习和实践。
首先,阅读标准文档本身。虽然ISO/ANSI C++标准文档篇幅庞大且技术性极强,但它是最权威的参考。对于关键问题,查阅标准原文能够给出最准确的答案。
其次,阅读权威参考书籍。有许多优秀的书籍专门讲解C++标准,如《The C++ Programming Language》(Bjarne Stroustrup著)、《The C++ Standard Library》(Nicolai Josuttis著)等。这些书籍将标准内容组织得更易于理解。
第三,关注编译器的标准符合性。不同编译器对标准的支持程度不同,了解你所使用编译器的标准符合性情况,可以避免编写不可移植的代码。
第四,参与社区讨论。C++标准委员会的工作是公开的,可以通过邮件列表、会议记录等了解标准的最新进展。同时,Stack Overflow、cppreference等社区也是学习标准的好地方。
第五,编写符合标准的代码。理论知识需要通过实践来巩固。在编写代码时刻意遵循标准,避免使用编译器扩展,培养编写可移植代码的习惯。
四、标准与现实的平衡
在实际开发中,需要在标准纯粹性和现实需求之间找到平衡。
一方面,坚持使用标准特性可以确保代码的可移植性。当项目需要在不同平台、不同编译器间移植时,遵循标准能够避免大量重写工作。
另一方面,适当使用编译器扩展可以提升开发效率。某些编译器扩展确实提供了便利的功能或性能优化。在使用扩展时,应当将其封装在特定平台相关的代码中,并通过条件编译等手段提供标准替代方案。
最重要的是保持对标准的敬畏之心。标准代表了C++语言的设计哲学和最佳实践,理解标准背后的原理,比记住标准条文更为重要。当你熟悉了标准,你就掌握了C++语言的精髓,能够写出既高效又可移植的优质代码。
