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

请记住:

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

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

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

  TR1代表“Technical Report 1”,TR1宣示了一个新版C++的来临,我们可能称之为Standard C++1.1。不熟悉TR1机能而却奢望成为一位高效的C++程序员是不可能的,因为TR1提供的机能几乎对每一种程序库和每一种应用程序都带来利益。

  在概括论述TR1有些什么之前,我们先回顾一下C++98列入C++标准程序库有哪些主要成分:

  (1)STL,覆盖容器、迭代器、算法、函数对象、各种容器适配器和函数对象适配器。

  (2)Iostreams,覆盖用户自定缓冲功能,国际化I/o,以及预先定义的对象cin,cout,cerr和clog。

  (3)国际化支持,包括多区域能力。像wchar_t和wstring(由wchar_ts组成的strings)都对促进Unicode有所帮组。

  (4)数值处理,包括复数模板(complex)和纯数值数组(valarray)。

  (5)异常阶层体系(exception hierarchy),包括base class exception及其derived classes logic_error和runtime_error,以及更深继承的各个classes。

  (6)c89标准程序库。1989 c标准程序库内的每个东西也都被覆盖于c++内。

  如果上述任何一项不熟悉,建议好好排除一些时间,带着你最喜爱的c++书籍,把情势扭转过来。

  TR1详细叙述了14个新组件(components,也就是程序库机能单位),统统放在std命名空间内,更准确的说是其嵌套命名空间tr1内。本书展示TR1组件:

  (1)智能指针tr1::shared_ptr和tr1::weak_ptr。前者的作用有如内置指针,但会记录有多少个tr1::shared_ptrs共同指向同一个对象。所谓的reference counting(引用计数)。一旦最后一个这样的指针被销毁,这个对象被自动删除。但是如果两个或多个这样的指针形成环,这会造成每个对象的引用次数都超过0——即使这个环形的指所有指针都已被销毁。tr1::weak_ptr的设计使其表现像是“非环形tr1::shared_ptr-based数据结构”中的环形感生指针(cycle-including pointers)。tr1::weak_ptr并不参与引用计数的计算;当最后一个指向某对象的tr1::shared_ptr被销毁,纵使还有个tr1::weak_ptrs继续指向同一对象,该对象仍旧会被删除。这种情况下的tr1::weak_ptr会被自动标示无效。

  (2)tr1::function,可以表示任何callable entity(可调用物,也就是任何函数或函数对象)

void registerCallbask(std::string fun(int));//参数类型是函数,该函数接受一个int并返回一个string

// 其中参数名称可有可无:
void registerCallback(std::string (int)); // 这里std::string (int)是个函数签名。

  tr1::function使上述的registerCallback有可能更富弹性地接受任何可调用物(callable entity)。tr1::funtion是个template,以其目标函数的签名为参数:

void registerCallback(std::tr1::function<std::string (int)>func);

  (3)tr1::bind,他能够做stl绑定器bind1st和bind2nd所做的每件事,而又更多。是第二代绑定器,比前一代好用的多。条款35示范过其用法。

  其他TR1组件划分为两组。第一组提供彼此不相干的独立机能:

  (4)Hash table,用来实现sets,multisets,maps, 和multi-maps。每个新容器的接口都以前任对应器塑模而成,他们的名称:tr1::unordered_set, tr1::unordered_multiset, tr1::unordered_map, tr1::unordered_multimap.

  (5)正则表达式

  (6)tuples(变量组),pair只能持有两个对象,tr1::tuple可持有任意个数的对象。

  (7)tr1::array,大小固定,并不适用动态内存。

  (8)tr1::mem_fn,这个语句构造上与成员函数指针(member function pointers)一致的东西。纳入并扩充了c++98的mem_fun和mem_fun_ref的能力。

  (9)tr1::reference_wrapper,“让一个reference 的行为更像对象”的设施。

  (10)随机数生成工具,大大超越了rand。

  (11)数学特殊函数,包括Laguerre多项式、Bessel函数、完全椭圆几分,以及更多数学函数。

  (12)c99兼容扩充。将许多新的c99程序库特性带进c++。

  第二组TR1组件由更精巧的template编程技术(包括template metaprogramming)构成:

  (13)type traits,一组traits classes,用以提供类型(types)的编译期信息。

  (14)tr1::result_of,这是个template,用来推导函数调用的返回类型。

  tr1只是一份文档。为了取得它所规范的那些机能,必须取得实现代码。这写代码最终会随编译器出货。boost是个Tr1-like机能而言绝佳的资源。tr1中的14个组件中的10个奠基于免费的boost程序库,可以先用boost代替tr1,别名法:

namespace std{
namespace tr1 = ::boost;
}

故而:
  1. C++标准程序库的主要机能有STL,iostreams, locales组成。并包含C99标准程序库。

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

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

条款55 : 让自己熟悉Boost

  高质量,源码开放、平台独立、编译器独立的程序库。 http://boost.org, (1)它和c++标准委员会之间有着独一无二的密切关系,并对委员会深具影响力。(2)它以公开进行的同僚复审(public peer review)为基础接纳程序库。

  boost对付的主题非常繁多,包括:

  (1)字符串与文本处理

  (2)容器

  (3)函数对象和高级编程,lambda,可以让我们轻松的随时随地创建函数对象。

using namespace boost::lambda;                                                    //让boost::lambda的机能曝光
std::vector<int> v;
std::for_each(v.begin(), v.end(), std::cout << _1* + << "\n"); //针对v中的每一元素x,印出x*2+10;
//其中“_1”是lambda程序库针对当前元素的一个占位符号(placeholder)

  (4)泛型编程,条款47.

  (5)模板元编程,条款48.

//list-like编译期容器,收纳三个类型:
//(float,double, long double),
typedef boost::mpl::list<float, double, long double> floats;
//在创建一个编译期间用以收纳类型的list, 以“floats”内的类型为基础
//最前面再加上“int”。新容器取名叫“types”
typedef boost::mpl::push_front<floats, int>::Type types;

  (6)数学和数值

  (7)正确性测试,覆盖用来将隐式模板接口(implicit template interface,见条款41)形式化的程序库,以及针对“测试优先”编程形态而设计的措施。

  (8)数据结构,tuple程序库

  (9)语言间的支持,包括允许c++和python间的无缝互操作性。

  (10)内存,覆盖pool程序库,用来作出高效率而区块大小固定的分配器,以及多变化的智能指针,包括tr1的智能指针。non-tr1智能指针scope_array,那是个auto_ptr-like智能指针,用来动态分配数组。条款44有其用法。

  (11)杂项,包括crc检验、日期和时间处理等等

故而:

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

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

Effective C++ —— 杂项讨论(九)的更多相关文章

  1. More Effective C++: 06杂项讨论

    32:在未来时态下发展程序 世事永远在变,好的软件对于变化有良好的适应能力:可以容纳新的性质,可以移植到新的平台,可以适应新的需求,可以掌握新的输入.所谓在未来时态下设计程序,就是接受“事情总会改变” ...

  2. Effective java笔记(九),并发

    66.同步访问共享的可变数据 JVM对不大于32位的基本类型的操作都是原子操作,所以读取一个非long或double类型的变量,可以保证返回的值是某个线程保存在该变量中的,但它并不能保证一个线程写入的 ...

  3. 《Effective C++》读书摘要

    http://www.cnblogs.com/fanzhidongyzby/archive/2012/11/18/2775603.html 1.让自己习惯C++ 条款01:视C++为一个语言联邦 条款 ...

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

    A person who is virtuous is also courteous. "有德者必知礼" 书本介绍:<Effective C++:改善程序与设计的55个具体做 ...

  5. Effective C#中文版

    我看的书是<Effective C#中文版——改善C#程序的50种方法>,Bill Wagner著,李建忠译.书比较老了,04年写的,主要针对C#1.0,但我相信其中的观点现在仍有价值.( ...

  6. C++学习书籍推荐《More Effective C++》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <More Effective C++:35个改善编程与设计的有效方法(中文版)>:传世经典书丛 媒体推荐 <Effective c++&g ...

  7. C++学习书籍推荐《Effective C++ 第三版》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)>前两个版本抓住了全世界无数程序员的目光.原因十分明显:S ...

  8. Effective C++读书笔记(转)

    第一部分 让自己习惯C++ 条款01:视C++为一个语言联邦 一.要点 ■ c++高效编程守则视状况而变化,取决于你使用c++的哪一部分. 二.扩展 将c++视为一个由相关语言组成的联邦而非单一语言会 ...

  9. Effective C++学习记录

    Effective C++算是看完了,但是并没有完全理解,也做不到记住所有,在此记录下55个条款及条款末的"请记住". 让自己习惯C++ 条款01:视C++为一个语言联邦 ① C ...

随机推荐

  1. [sz,rz]使用sz/rz在两台Linux设备之间传输数据

    转自:https://superuser.com/questions/604055/using-rz-and-sz-under-linux-shell zsend #!/bin/sh DEV=/dev ...

  2. Quartz 一个JOB 配置多个Trigger时注意的问题

    public class SimpleExample { public void run() throws Exception { Logger log = LoggerFactory.getLogg ...

  3. Android自己定义控件--圆形进度条(中间有图diao)

    智能家居越来越流行,在智能家居中我们常要表现一些数据的百分比 圆形度条中间加个图是一种很流行的自己定义View 1.第一步 你首先须要对类进行继承View public class CirclePro ...

  4. spring boot 拦截器之WebMvcConfigurerAdapter

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   上一篇我们讲到了拦截器,我们也简单的讲解到了WebMvcConfigurerAdapter这个拦截器.本篇我们来对Web ...

  5. DataGridView基本操作

    1.获得某个(指定的)单元格的值:dataGridView1.Row[i].Cells[j].Value;2.获得选中的总行数:dataGridView1.SelectedRows.Count;3.获 ...

  6. SBT树

    转自:http://jcf94.com/2015/06/19/2015-06-19-sbt/ 总结: 二叉查找树(或称二叉搜索树.二叉排序树):大的右边.小的左边.问题:不平衡,输入有序情况下从平均性 ...

  7. 非常强大的jQuery万能浮动框插件

    支持hover, click, focus以及无事件触发:支持多达12种位置的定位,出界自动调整:支持页面元素加载,Ajax加载,下拉列表,提示层效果,tip类效果等:可自定义装载容器:内置UI不错的 ...

  8. 不可将布尔变量直接与 TRUE、FALSE 或者 1、0 进行比较

    不可将布尔变量直接与 TRUE.FALSE 或者 1.0 进行比较. 根据布尔类型的语义,零值为“假”(记为 FALSE),任何非零值都是“真”(记为 TRUE). TRUE 的值究竟是什么并没有统一 ...

  9. goto 语句

    goto 语句 自从提倡结构化设计以来,goto 就成了有争议的语句. 首先,由于 goto 语句可以 灵活跳转,如果不加限制,它的确会破坏结构化设计风格.其次,goto 语句经常带来错 误或隐患. ...

  10. 帝国CMS“建立目录不成功!请检查目录权限”的解决办法

    初次安装帝国CMS就遇到了一个问题,在提交或者修改信息的时候提示“建立目录不成功!请检查目录权限”,无法生成页面.检查了文件夹的读写权限和用户访问权限,发现都一切正常.那么到底是哪里出错了呢? 其实是 ...