9. 杂项讨论
53. 不要轻忽编译器的警告
1 |
|
希望D::f重新定义virtual函数B::f,B的f 是个const成员函数,而D中未被声明为const
- 严肃对待编译器发出的警告信息。
- 不要过度依赖编译器的报警能力,不同编译器的警告信息可能不同
54. 让自己熟悉包括TR1在内的标准程序库
- TR1表示“Technical Report 1"
- TR1组件实例
- 智能指针 trl::shared_ptr和tr1::weak_ptr
- 前者作用如内置指针,但会记录有多少个tr1::shared_ptrs共同指向同一个对象。这就是引用计数 reference countering。一旦最后一个这样的指针被销毁,也就是一旦某对象的引用次数变成,这个对象会被自动删除。这在非环形数据结构中防止资源泄露很有帮助,
- 如果两个或者多个对象内含trl::shared_ptrs并形成环状,这个唤醒会造成每个对象的引用次数都超过0,即使指向这个环形的所有指针都已被销毁
- 这就是有trl::weak_ptrs的原因,并不参与引用计数的计算;当最后一个指向对象的trl:shared_ptr被销毁,纵使还有个trl::weak_ptr继续指向同一对象,该对象仍会被删除,该情况下的weak_ptr被自动标示无效
- 智能指针 trl::shared_ptr和tr1::weak_ptr
- trl::function
- 表示任何可调用物(任何函数或者函数对象),只要签名符合目标
- 假设想注册一个callback函数
- void registerCallback(std::string func(int));参数名称func可有可无,可以这样声明void registerCallback(std::string (int));std::string (int)是函数签名trl::function是上述的函数有可能更富弹性地接受任何可调用五,只要这个可调用五接受一个int或任何可悲转换为int的东西,并返回一个string或这和可被转换为string的东西
- trl::function是个template,以其目标函数的签名为参数
1 |
|
- tr1::bind
- 能够做STL绑定器bind1st和bind2nd所做的每一件事,而又更多
- 与前任绑定器不同的是,tr1::bind可以和const及non-const成员函数协同运作,可以和by-reference参数协同运作
- 不需要特殊协助就可以处理函数指针,所以我们调用tr1::bind之前不必再被什么ptr_fun,men_fun或者mem_fun_ref搞得一团混乱。
- tr1::bind是第二代绑定工具,比前一代好很多
- 彼此互不相干的独立机能:
- hash tables:
- 用来实现sets,multisets,maps和multi-maps
- 每个新容器的接口都是其前任对应容器塑模而成
- 名称tr1::unordered_set, tr1::unordered_multiset, tr1::unordered_map, tr1::unordered_multimap
- 这些名字强调他们和set,multiset, map 或者multimap不同,以hanshu为基础的这些TR1容器内的元素并无任何可预期的次序
- 正则表达式
- 包括正则表达式为基础的字符串查找和替换,
- 或者从某个匹配字符串到另一匹配字符串的注意迭代等
- Tuples(变量组),这是标准程序库中pair template的新一代制品。
- pair只能有两个对象
- tr1::tuple可以持有任意个数的对象。
- tr1::array,本质上是个STL化的数组,即一个支持成员函数如begin和end的数组,不过tr1::array的大小固定,并不适用动态内存
- tr1::mem_fn
- 这是个语句构造上与成员函数指针一样的东西
- 纳入并扩充了c++98的mem_fun和mem_fun_ref的能力
- tr1::reference_wrapper
- 让reference的行为更像对象的设施
- 可以造成容器“犹如持有reference”,实际上,容器只能吃有对象或指针
- 随机数生成工具,大大超越了rand
- 数学特殊函数,包括laguerre多项式,Bessel函数,完全椭圆积分以及更多数学函数
- C99兼容扩充。
- 这是一大堆函数和模板,用来将许多新的c99程序库特性带进C++
- hash tables:
- 更精巧的template编程
- Type traits
- 一组trait classes,用来一同类型的编译期信息
- 给予一个类型T,TR1的type traits可以指出T是否是个内置类型,是否一同virtual析构函数,是否是个empty class,可隐式转换为其他类型U
- 也可以显现该给定类型之适当齐位,这对定制型内存分配器而言是关键信息。
- tr1::result_of
- 这是个template,用来推导函数调用的返回类型
- 在编写templates时,能够refer to函数调用动作返回的对象的类型往往很重要,但是该类型有可能以复杂的方式却决于函数的参数类型
- result_of使得”refer to函数返回类型“变得十分容易
- Type traits
- C++标准程序库的主要机能由STL、iostreams、locales组成,并包含C99标准程序库
55. 让自己熟悉Boost
- 字符串与文本处理
- 覆盖具备类型安全的printf-like格式化动作、正则表达式,以及语汇单元切割和解析
- 容器,覆盖”接口与STL相似且大小固定“的数组、大小可变的bitsets以及多维数组
- 函数对象与高级编程
- 覆盖若干被用爱作为TR1机能基础的程序库。其中一个有趣的程序库是Lambda,可以随时随地创建函数对象
1 |
|
- 泛型编程,覆盖一大组traits classes
- 模板元编程
- 覆盖一个针对编译期assertions而写的程序库,以及Boost MPL程序库,提供了极好的东西,其中支持编译器实物诸如types的STL-like数据结构等
- 数学和数值
- 包括有理数,八元数和四元数、公约数和少见的多重运算、随机数
- 正确性和测试
- 覆盖用来将隐式模板接口形式化的程序库,以及针对"测试有限"编程形态而设计的措施
- 数据结构
- 覆盖类型安全的unions,以及tuple程序库(是TR1同类机能的基础)
- 语言见的支持
- 包括允许C++和python之间的无缝互操作性
- 内存
- 覆盖Pool程序库,用来做出高效率而区块大小固定的分配器以及多变化的智能指针,包括(但不仅仅是)TR1智能指针。
- 另有一个non-TR1智能指针是scoped_array,是个auto_ptr-like智能指针,用来动态分配数组
- 杂项
- 包括CRC检验、日期和时间的处理,在文件系统上来回移动等等
1 |
|
这样的容器类型常被成为typelists
9. 杂项讨论
http://binbo-zappy.github.io/2024/11/27/effective-cpp/9-杂项讨论/