九、杂项讨论
(53)、不要轻忽编译器的警告
class B {
public:
virtual void f() const;
};
class D : public B {
publlic:
virtual void f();
};
这里希望以D::f重新定义virtual函数B::f,但其中有个错误:B中的f是个const成员函数,而在D中它未被声明为const。我手上的一个编译器于是这样说话了:
warning: D::f() hides virtual B::f()。
这个警告告诉你声明于B中的f并未在D中被重新声明,而是被整个被掩盖了。如果忽略这个编译器警告,几乎肯定导致错误的程序行为,然后是许多调试行为,只为了找出编译器其实早就侦测出来并告诉你的事情。
不管怎样说,在你打发某个警告信息之前,请确定你了解它意图说出的精确意义。
记住,警告信息天生和编译器相依,不同的编译器有不同的警告标准。
请记住:
严肃对待编译器发出的警告信息。努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉。
不要过度依赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同。一旦移植到另一个编译器上,你原本依赖的警告信息有可能消失。
(54)、让自己熟悉包括TR1在内的标准程序库
TR1代表“Technical Report 1”,宣示一个新版C++的来临,我们可能称之为Standard C++ 1.1。
C++98列入的C++标准程序库主要成分:
STL(Standard Template Library,标准模板库)。
Iostreams。
国际化支持。
数据处理。
异常阶层体系(exception hierarchy)。
C89标准程序库。
TR1详细叙述了14个新组建(components,也就是程序库机能单位),统统都放在std命名空间内,更正确地说是在其嵌套命名空间tr1内。因此,TR1组件shared_ptr的全名是std::shared_ptr。本书通常在讨论标准程序库组件时略而不写std::,但我总是会在TR1组件之前加上tr1::。
本书展示一下TR1组件实例:
智能指针(smart pointer)tr1::shared_ptr和tr1::weak_ptr。
tr1::function,此物得以表示任何callable entity(可调用物,也就是任何函数或函数对象),只要其签名符合目标。
tr1::bind,它能够做STL绑定器(binders)bind1st和bind2nd所做的每一件事,而又更多。
我把其他TR1组件划分为两组。第一组提供彼此互不相干的独立机能。
Hash tables,用来实现sets,multisets,maps和multi-maps。
正则表达式(Regular expressions)。
Tuples(变量组),这是标准程序库中的pair template的新一代制品。
tr1::array,本质上是个“STL化”数组,即一个支持成员函数如begin和end的数组。
tr1::mem_fn,这是个语句构造上与成员函数指针(member function pointer)一致的东西。
tr1::reference_warpper,一个“让references的行为更像对象”的设施。
随机数(random number)生成工具,它大大超越了rand,那是C++继承自C标准程序库的一个函数。
数学特殊函数。
C99兼容扩充。
第二组TR1组件由更精巧的template编程技术(包括template metaprogramming,也就是模板元编程)构成。
Type traits,一组traits classes,用以提供类型(types)的编译期信息。
tr1::result_of,这是个template,用来推导函数调用的返回类型。
TR1自身只是一份文档。
请记住:
C++标准程序库的主要机能由STL、iostream、locales组成。并包含C99标准程序库。
TR1添加了智能指针(例如tr1::shared_ptr)、一般化函数指针(tr1::function)、hash-based容器、正则表达式(regular ecpression)以及另外10个组件的支持。
TR1自身是一份规范。为获得TR1提供的好处,你需要一份实物。一个好的实物来源是Boost。
(55)、让自己熟悉Boost
Boost是一个C++开发者集结的社群,也是一个可自由下载的C++程序库群。
Boost程序库对付的主题非常繁多,区分数十个类目,包括:
字符串与文本处理。
容器。
函数对象和高级编程
泛型编程(Generic programming)
模板元编程(Template metaprogramming,TMP)
数学和数值(Math and numerics)
正确性与测试(Correctness and testing)
数据结构
语言间的支持
内存
杂项
请记住:
Boost是一个社群,也是一个网站。致力于免费、源码开放、同僚复审的C++程序库开放。Boost在C++标准化过程中扮演深具影响力的角色。
Boost提供许多TR1组件实现品,以及其他许多程序库。