9. 杂项讨论

53. 不要轻忽编译器的警告

1
2
3
4
5
6
7
8
9
class B{
public:
virtual void f() const;
}

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

希望D::f重新定义virtual函数B::f,B的f 是个const成员函数,而D中未被声明为const

  1. 严肃对待编译器发出的警告信息。
  2. 不要过度依赖编译器的报警能力,不同编译器的警告信息可能不同

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

  1. TR1表示“Technical Report 1"
  2. TR1组件实例
    1. 智能指针 trl::shared_ptr和tr1::weak_ptr
      1. 前者作用如内置指针,但会记录有多少个tr1::shared_ptrs共同指向同一个对象。这就是引用计数 reference countering。一旦最后一个这样的指针被销毁,也就是一旦某对象的引用次数变成,这个对象会被自动删除。这在非环形数据结构中防止资源泄露很有帮助,
      2. 如果两个或者多个对象内含trl::shared_ptrs并形成环状,这个唤醒会造成每个对象的引用次数都超过0,即使指向这个环形的所有指针都已被销毁
      3. 这就是有trl::weak_ptrs的原因,并不参与引用计数的计算;当最后一个指向对象的trl:shared_ptr被销毁,纵使还有个trl::weak_ptr继续指向同一对象,该对象仍会被删除,该情况下的weak_ptr被自动标示无效
  3. trl::function
    1. 表示任何可调用物(任何函数或者函数对象),只要签名符合目标
    2. 假设想注册一个callback函数
    3. void registerCallback(std::string func(int));参数名称func可有可无,可以这样声明void registerCallback(std::string (int));std::string (int)是函数签名trl::function是上述的函数有可能更富弹性地接受任何可调用五,只要这个可调用五接受一个int或任何可悲转换为int的东西,并返回一个string或这和可被转换为string的东西
    4. trl::function是个template,以其目标函数的签名为参数
1
2
void registerCallback(std::tr1::function<std::string (int)> func);
//只要该可调用物的签名与std::string(int)一致
  1. tr1::bind
    1. 能够做STL绑定器bind1st和bind2nd所做的每一件事,而又更多
    2. 与前任绑定器不同的是,tr1::bind可以和const及non-const成员函数协同运作,可以和by-reference参数协同运作
    3. 不需要特殊协助就可以处理函数指针,所以我们调用tr1::bind之前不必再被什么ptr_fun,men_fun或者mem_fun_ref搞得一团混乱。
    4. tr1::bind是第二代绑定工具,比前一代好很多
  2. 彼此互不相干的独立机能:
    1. hash tables:
      1. 用来实现sets,multisets,maps和multi-maps
      2. 每个新容器的接口都是其前任对应容器塑模而成
      3. 名称tr1::unordered_set, tr1::unordered_multiset, tr1::unordered_map, tr1::unordered_multimap
      4. 这些名字强调他们和set,multiset, map 或者multimap不同,以hanshu为基础的这些TR1容器内的元素并无任何可预期的次序
    2. 正则表达式
      1. 包括正则表达式为基础的字符串查找和替换,
      2. 或者从某个匹配字符串到另一匹配字符串的注意迭代等
    3. Tuples(变量组),这是标准程序库中pair template的新一代制品。
      1. pair只能有两个对象
      2. tr1::tuple可以持有任意个数的对象。
    4. tr1::array,本质上是个STL化的数组,即一个支持成员函数如begin和end的数组,不过tr1::array的大小固定,并不适用动态内存
    5. tr1::mem_fn
      1. 这是个语句构造上与成员函数指针一样的东西
      2. 纳入并扩充了c++98的mem_fun和mem_fun_ref的能力
    6. tr1::reference_wrapper
      1. 让reference的行为更像对象的设施
      2. 可以造成容器“犹如持有reference”,实际上,容器只能吃有对象或指针
    7. 随机数生成工具,大大超越了rand
    8. 数学特殊函数,包括laguerre多项式,Bessel函数,完全椭圆积分以及更多数学函数
    9. C99兼容扩充。
      1. 这是一大堆函数和模板,用来将许多新的c99程序库特性带进C++
  3. 更精巧的template编程
    1. Type traits
      1. 一组trait classes,用来一同类型的编译期信息
      2. 给予一个类型T,TR1的type traits可以指出T是否是个内置类型,是否一同virtual析构函数,是否是个empty class,可隐式转换为其他类型U
      3. 也可以显现该给定类型之适当齐位,这对定制型内存分配器而言是关键信息。
    2. tr1::result_of
      1. 这是个template,用来推导函数调用的返回类型
      2. 在编写templates时,能够refer to函数调用动作返回的对象的类型往往很重要,但是该类型有可能以复杂的方式却决于函数的参数类型
      3. result_of使得”refer to函数返回类型“变得十分容易
  4. C++标准程序库的主要机能由STL、iostreams、locales组成,并包含C99标准程序库

55. 让自己熟悉Boost

  1. 字符串与文本处理
    1. 覆盖具备类型安全的printf-like格式化动作、正则表达式,以及语汇单元切割和解析
  2. 容器,覆盖”接口与STL相似且大小固定“的数组、大小可变的bitsets以及多维数组
  3. 函数对象与高级编程
    1. 覆盖若干被用爱作为TR1机能基础的程序库。其中一个有趣的程序库是Lambda,可以随时随地创建函数对象
1
2
3
4
5
using namespace boost::lambda;
std::vector<int> v;

std::for_each(v.begin(),v.end()),
std::cout << _1 *2 + 10 << "\n");
  1. 泛型编程,覆盖一大组traits classes
  2. 模板元编程
    1. 覆盖一个针对编译期assertions而写的程序库,以及Boost MPL程序库,提供了极好的东西,其中支持编译器实物诸如types的STL-like数据结构等
    2. 数学和数值
      1. 包括有理数,八元数和四元数、公约数和少见的多重运算、随机数
    3. 正确性和测试
      1. 覆盖用来将隐式模板接口形式化的程序库,以及针对"测试有限"编程形态而设计的措施
    4. 数据结构
      1. 覆盖类型安全的unions,以及tuple程序库(是TR1同类机能的基础)
    5. 语言见的支持
      1. 包括允许C++和python之间的无缝互操作性
    6. 内存
      1. 覆盖Pool程序库,用来做出高效率而区块大小固定的分配器以及多变化的智能指针,包括(但不仅仅是)TR1智能指针。
      2. 另有一个non-TR1智能指针是scoped_array,是个auto_ptr-like智能指针,用来动态分配数组
    7. 杂项
      1. 包括CRC检验、日期和时间的处理,在文件系统上来回移动等等
1
2
typedef boost::mpl::list<float, double, long double> floats;
typedef boost::mpl::push_front<floats, int>::type types;

这样的容器类型常被成为typelists


9. 杂项讨论
http://binbo-zappy.github.io/2024/11/27/effective-cpp/9-杂项讨论/
作者
Binbo
发布于
2024年11月27日
许可协议