《Effective C++》:条款52-条款55

最后这三个条款属于杂项。条款53告诉我们不要忽略警告,虽然程序可以编译通过,但是要搞明白警告信息。条款54和条款55讲解C++的库,一个是TR1文档,一个是Boost。现在C++11标准已定,且有编译器支持。Boost库一些内容已经标准化到C++11,与其学习Boost,不如熟悉C++11中的Boost库内容。

条款53:不要轻忽编译器的警告

许多程序员习惯性的忽略编译器的警告。或许它们认为,如果问题很严重,那么编译器应该给一个错误而不是警告。这种想法在C++非常有害,以一个例子来说明:

  class B{
    public:
        virtual void f() const;
    };
    class D: public B{
    public:
        virtual void f();
    };

这里希望D::f重新定义virtual函数B::F,但是D中却没有声明为const。编译器不会报错,可能会给如下警告

warning: D::f() hides virtual B::f()

你或许会想,D::f()遮掩了B::F,这正是我们想做的事。但是编译器在试图告诉你B::f并没有在D中重新声明,而是被遮掩了。如果忽略这个警告,比如导致错误行为。

从编译器的警告中获得经验,学会了解警告信息和它们看起来的意义并不十分相同。在最高警告级别下没有任何警告的程序是最理想的,但是对警告欧了深刻理解,可以选择忽略某些警告信息。但是一定记住在忽略这个警告之前,一定要了解它的真实意图。

警告信息和编译器相关,不同的编译器有不同的警告标准。例如上面代码中的函数遮掩在另一个编译器编译,可能没有任何警告。

总结

  • 严肃对待编译器发出的警告信息。努力在你的编译器最高警告级别下做到无任何警告。
  • 不要过度依赖编译器的报警能力,因为不同编译器对待事情的态度不相同。一段有警告的代码,移植到另一个编译器上,可能没有任何警告。

条款54:让自己熟悉包括TR1在内的标准程序库

本书中的C++规范是在1998年制定的。现在C++11,即C++0x已经制定,且C++14在讨论中。本条款讨论内容是关于Boost库的,当时没有制定新标准,一些语言上的新特性以技术报告内容程序给大家,TR1代表Technical Report 1。

现在来看一下C++98加如的标准程序库有哪些:

  • STL,即Standard Template Library标准模板库。
  • iostreams,包含用户自定义缓冲功能、国际化I/O,以及先定义好的对象cin、cout、cerr和clog。
  • 国家化支持,包括多区域能力。
  • 数值处理,包括复数模板(complex)和纯数值数值(valarray)。
  • 异常阶层体系(exception hierarchy)。
  • C89标准程序库。

TR1详细叙述了14个新组件(components,即程序机能单位),放在命名空间std::tr1内。下面展示一下TR1组件实例:

  • 智能指针
  • tr1::function,可以表示任何callable entity(可调用物,即任何函数或函数对象),只要签名复合目标。
  • tr1::bind,它能做STL绑定器(binders)bind1st和bind2nd所做的每一件事,且更多。

把TR1组件划分为2组,第一组提供彼此互不相干的机能:

  • Hash table,可以用来实现set、map等。
  • 正则表达式(Regular expression),包括以正则表达式为基础的字符串查找和替换等。
  • Tuples(变量组),这是标准程序库中的pair template的新一代制品。
  • tr1::array,本质是一个支持成员函数begin和end的数组。
  • tr1::mem_fn,这是个语句构造上与成员函数指针(member function pointer)一致的东西。
  • tr1::reference_wrapper,一个让reference的行为更像对象的设施。
  • 随机数(random number)生成工具,它大大超越了rand。
  • 数学特殊函数。
  • C99兼容扩充。

第二组TR1组件由更精巧的template编程技术构成

  • Type traits,一组traits classes(**条款**47),用以提供类型的编译期信息。
  • tr1::result_of,这是个template,用来推导函数调用的返回类型。

总结

  • C++的标准程序的主要机能由STL、iostream、locales组成。并包含C99标准程序库。
  • TR1添加了智能指针、一般化函数指针、hash-based容器、正则表达式以及另外10个组件的支持。
  • TR1只是一份规范,为获得TR1提供的好处,需要一个实物,例如Boost。

条款55:让自己熟悉Boost

Boost库是一个高质量、源码开发、平台独立、编译器独立的程序库。Boost是一个C++开发者集结的社群,其网址为http://boost.org

Boost有着其他C++组织没有的影响里。1、Boost有C++标准委员会创建,其目标为:作为一个可被加入标准C++之各种功能的测试场。2、它接纳程序的过程,以公开进行的同僚(public peer review)为基础。

下面介绍Boost程序库的类目

  • 字符串与文本处理
  • 容器
  • 函数对象和高级编程
  • 泛型编程
  • 模板编程
  • 数学和数值
  • 正确性与测试
  • 数据结构
  • 语言间的支持
  • 内存杂项

总结

  • Boost是个社群,也是一个网址。致力于免费、源码开发、同僚复审的C++程序库开发。Boost在C++标准化过程中扮演深具影响里的角色。
  • Boost提供许多TR1组件实现品,以及其他许多程序库。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值