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

条款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*2 +10 << "\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组件实现品,以及其他许多程序库.

时间: 2024-10-10 22:27:40

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

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

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

九、杂项讨论

条款53:不要轻忽编译器的警告 编译器的作者对一些接下来可能发生的错误的理解一定胜过我们这些普通程序员,如果编译器发出警告,就表明可能存在某种情况会造成一些错误,而这些错误你可能都没想到过.所以我们不要忽略编译器的警告! class Base { public: virtual void f() const; }; class Derive { public: virtual void f(); }; 这一段编译后,编译器会发出警告: warning:D::f() hides virtual B

《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.因为或许 

Effective C++ 55个条款

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

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

开篇的话 这个星期不再发布关于数据结构的博客,想把半个月来看的书做一些总结,整理整理,第一本就是<Effective C++>.第一次看这本书是一年多前,准备考研复试的时候,随后陆陆续续,这个月再来看算是第三遍了吧,之前没有看过<深度探索C++对象模型>,所以有的地方看得不是很透彻(现在有的地方也看得不透,但是比以前好点了).还有另一本书就是<深度探索C++对象模型>,看第二遍,吸收得更容易了,看书总是这样,第一遍也许什么也不知道,但是只要坚持看下去,回过头来再读的时候

Effective C#中文版

我看的书是<Effective C#中文版--改善C#程序的50种方法>,Bill Wagner著,李建忠译.书比较老了,04年写的,主要针对C#1.0,但我相信其中的观点现在仍有价值.(平心而论,和Effective C++有差距,毕竟该书成书时对C#的研究不过几年.) 下面是对这本书条款内容的一些归纳和个人理解,由于我比较熟悉C++,因此也会有也一些C++的对比. 第一章 C#语言元素 条款1:使用属性代替可访问的数据成员 1. 属性具有数据成员的访问语法,这是最易于使用的语法. 2. 属

Effective C++读书笔记(转)

第一部分 让自己习惯C++ 条款01:视C++为一个语言联邦 一.要点 ■ c++高效编程守则视状况而变化,取决于你使用c++的哪一部分. 二.扩展 将c++视为一个由相关语言组成的联邦而非单一语言会帮助你更好的理解,其由c.object-oriented c++.template c++和stl四部分组成. 条款02:尽量以const,enum,inline替换#defines 一.要点 ■ 对于单纯变量,最好以const对象或enums替换#defines. ■ 对于形似函数的宏,最好改用i

Effective C++ 条款总结

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