九、杂项讨论

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

编译器的作者对一些接下来可能发生的错误的理解一定胜过我们这些普通程序员,如果编译器发出警告,就表明可能存在某种情况会造成一些错误,而这些错误你可能都没想到过。所以我们不要忽略编译器的警告!

class Base
{
public:
    virtual void f() const;
};
class Derive
{
public:
    virtual void f();
};

这一段编译后,编译器会发出警告:

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

这个警告是告诉你整个B::f()都被遮掩了,而不是说只是B::f()去掉了const。

如果你认为只是遮掩住了const,就大错特错。

作者总结

严肃对待编译器发出的警告信息。努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉。

不要过度依赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同。一旦移植到另一个编译器上,你原本依赖的警告信息有可能消失。

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

TR1代表“Technical Report 1”。

在概括TR1之前看一下C++98列入C++标准程序库有哪些主要成分:

  • STL。
  • Iostream,覆盖用户自定缓冲功能,国际化IO,以及预先定义好的对象cin,cout,cerr和clog。
  • 国际化支持,包括多区域能力,比如wchar_t和wstring。
  • 数值处理。 包括复数模板(complex)和纯数值数组(valarray)。
  • 异常阶层体系。
  • C89标准程序库。

下面展示TR1组件实例:

  • 智能指针。
  • tr1::function.此物得以表示任何callable entity(可调用物,也就是任何函数或函数对象)。比如我们想注册一个回调函数,该函数接受一个int并且返回一个string,我们可以这么写:

    void registerCallback(std::string(int));

    使用了tr1::function的话,更富有弹性。**我们接受一个int或者任何一个能够转为int的数值,并返回一个string或者任何能转成string的东西:

    void registerCallback(std::tr1::function

  • tr1::bind,这个也很重要,具体另外的博客会谈到。
  • Hash tables.用来实现set,multi_set,map,multi_map.
  • 正则表达式
  • Tuples,即变量组。tr1::tuple可持有任意个数的对象。
  • tr1::array.是个STL化的数组,支持成员函数begin和end的数组,大小固定,并不适用动态内存。
  • tr1::reference_wrapper.
  • 随机数生成工具。
  • 数学特殊函数。 包括Laguerre多项式,Bessel函数,完全椭圆积分等。
  • C99兼容扩充。
  • Type traits.
  • tr1::result_of,是一个template,用来推导函数调用的返回类型。

作者总结

C++标准程序库的主要机能由STL,iostream,locals组成,并包含C99标准程序库。

TR1添加了智能指针(shared_ptr),一般化函数指针(tr1::function),hash-based容器,正则表达式以及另外10个组件支持。

TR1自身知识一份规范。为获得TR1提供的好处,你需要一份实物,一个好的实物来源是Boost。

条款55:让自己熟悉Boost

为什么要熟悉Boost?

一是因为它和C++标准委员会之间有着很大联系:是由委员会成员创设的。

二是它接纳程序库的过程比较规范:

(1) 先发送邮件投递作品,Boost开发者会评估这个程序库的重要性,并且启动初步审查程序。

(2) 然后开始“讨论,琢磨,再次提交”循环周期。

(3) 最后准备好程序库,正式提交。会有一位复审管理员出面确认你的程序符合Boost的最低要求。比如最少通过两个编译器的,满足可移植性。

(4) 然后你的提交正式进入Boost社群,等待官方复审。期间会有志愿者查看你的程序库的各种素材,并考虑诸如以下问题:

  • 这一份设计和实现有多好?
  • 这些代码可跨编译器和操作系统吗?
  • 这个程序库有可能被它所设定的目标用户————也就是在这个程序库企图解决问题的领域中工作的人们使用吗?
  • 文档是否清楚、齐备,而且精准吗?
  • 字符串与文本处理。 覆盖具备类型安全等吗。

作者总结

Boost是一个社群,也是一个网站。致力于免费、源码开放、同僚复审的C++程序库开发。Boost在C++标准化过程中扮演深具影响力的角色。

Boost提供许多TR1组件实现品,以及其他许多程序库。

原文地址:https://www.cnblogs.com/love-jelly-pig/p/9738922.html

时间: 2024-10-13 06:39:37

九、杂项讨论的相关文章

Effective c++(笔记) 之 杂项讨论

看到了Effective c++的最后一章,最开始的那章---内存管理还没搞清楚,准备那章搞清楚完也写篇博客,不管怎样,有好的开始就应该让它有个完美的结束,杂项讨论这章是作者将那些分到哪章都不合适的就索性放到了最后讨论,我看完后从中摘出自己认为重要的坐下笔记,如果能帮得到大家,那就更荣幸了哈! 1.当我们定义一个类时,编译器会自动给我产生哪些成员函数? 解析:我们都知道,当我们定义类时,如果我们没有定义某些成员函数的话,编译器会总会给我们自动合成,这就是编译器默默为我们完成和调用函数,这些函数主

Effective C++ —— 杂项讨论(九)

条款53 : 不要轻忽编译器的警告 请记住: 1. 严肃对待编译器发出的警告信息.努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉. 2. 不要过度倚赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同.一旦移植到另一个编译器上,你原本倚赖的警告信息有可能消失.  条款54 : 让自己熟悉包括TR1在内的标准程序库 TR1代表“Technical Report 1”,TR1宣示了一个新版C++的来临,我们可能称之为Standard C++1.1.不熟悉TR1机能而却奢望成

九章讨论算法(备用)

1.检测邮箱valide http://www.cplusplus.com/forum/general/65108/ 2.检测手机号valide https://leetcode.com/problems/valid-phone-numbers/

Effective C++ 条款总结

自己在看这本书的时候,回去翻看目录的时候,有些规则会被遗忘,因此做个简单的小总结供自己和其他人参考,没读过的还是要先去读一遍的 一.让自己习惯C++ 1.视C++为一个语言联邦 C++是一种包含许多特性的语言,因而不要把它视为一个单一语言.理解C++至少需要学习一下4个部分: ①C语言.C++仍以C为基础 ②objected-oriented C++.面向对象编程,类.封装.继承.多态 ③template C++.C++泛型编程.模板元编程的基础 ④STL.容器.迭代器.算法 2.尽量使用con

《Effective C++》重点摘要(九)

<Effective C++>第九章:杂项讨论 不要轻忽编译器的警告.严肃对待编译器发出的警告信息.努力在最高警告级别下争取无警告.也不要过度依赖编译器给出的警告信息,不同的编译器给出的警告信息是不一样的,甚至给出警告的点也不一样. 让自己熟悉包括TR1在内的标准程序库. 让自己熟悉Boost. C++不想Java和C#那样,语言本身就带有很强大的库,所以外部的程序库对于编写C++程序至关重要.俗话说不要重复发明轮子嘛,所以能用别人的就用吧.当然这是在实际工程中,学习阶段嘛,我还是比较推崇自己

《Effective C++》 阅读小结(笔记)

A person who is virtuous is also courteous. "有德者必知礼" 书本介绍:<Effective C++:改善程序与设计的55个具体做法>(中文版)(第3版) 一.让自己习惯C++ 1.如今的C++是一个多重范型的编程语言,同时支持过程形式(procedural).面向对象形式(object-oriented).函数形式(functional).泛型形式(generic).元编程形式(metaprogramming): 2.因为或许 

《More Effective C++》读书笔记

http://www.cnblogs.com/tianyajuanke/archive/2012/11/29/2795131.html 一.基础议题(Basics) 1.仔细区别 pointers 和 references 当一定会指向某个对象,且不会改变指向时,就应该选择 references,其它任何时候,应该选择 pointers. 实现某一些操作符的时候,操作符由于语义要求使得指针不可行,这时就使用引用. 二者之间的区别是:在任何情况下都不能用指向空值的引用,而指针则可以:指针可以被重新

C语言数据类型和算数运算

一. 进制转换: 要熟悉各进制之间相互的转换 1. 二进制 (0, 1) 2. 八进制 (0-7) 3. 十进制 (0-9) 4.十六进制 (0-9, A-F) (1). 十进制转二进制: (31)10=(11111)2 方法: 31/2, 上15余1 15/2, 上7余1 7/2, 上3余1 3/2, 上1余1 最后将所有的余数从下往上排列组合, 开头数字为最后一次运算的商数. (2). 二进制转十进制: (10110011)2=(179)10 方法:  101 1 00 1 1 ↓  ↓↓

Effective C++ 55个条款

Effective C++ 55个条款 让自己习惯C++ 视C++为一个语言联邦 C++高效编程守则视状况而变化,取决于你使用C++的哪一部分. 尽量以const,enums,inline替换#define 对于单纯常量,最好以const对象或enums替换#defines: 对于形似函数的宏(macros),最好改用inline函数替换#defines. 尽可能使用const 将某些东西声明为const可帮助编译器侦测出错误用法.const可被施加于任何作用域内的对象.函数参数.函数返回类型.