More Effective C++ 笔记 (二)
目录

25. 将Constructor和non-member functions虚化

Virtual constuctors,和构造函数一样新创建的对象并返回其pointer或reference。 一个特例是virtual copy constructors,常常以clone()形式出现,返回当前对象的副本(新对象)。 注意返回的base class pointer或reference可以指向derived class对象。

non-member functions的虚化可以是写一个虚函数做实际的工作,再写一个什么都不做的非虚函数,只负责调用虚函数。 并且这个非虚函数可以inlined。

26. 限制某个class所产生的对象数量

  1. 1个:单例模式

对于class和function的static成员,注意:

  • class的static数据成员即使从未被用到,也会被构造和析构。
  • function的local static变量在函数第一次调用时才产生。如果函数从未被调用,就绝不会产生。

  • 多个:可以实现Counter类计数。

27. 要求(或禁止)对象产生于heap之中

  1. heap-based objects: 声明private的constructor和destructor。

  2. 禁止对象产生于heap中: 声明private的operator new和operator delete。

28. Smart Pointers

auto_ptr废弃

29. Reference counting

shared_ptr

30. Proxy classes

CPP不支持二维数组的operator[][]操作。 因此要实现此操作,方法如下:

template<class T>
class Array2D {
public:
class Array1D {                                             // proxy class
public:
T& operator[](int index);
const T& operator[](int index) const;
...
}

Array1D operator[](int index);                                          // 以non-const object Array2D调用[]
const Array1D operator[](int index) const;                    // 以const object Array2D调用[]
};

因此可以用以下方法调用:

Array2D<int> data(10,20);
cout << data[3][6];

在调用operator[]时如果想区分lvalue和rvalue,通过const函数和non-const函数来区分是不行的(见以上注释)。 可以通过proxy class来实现。

31. 让函数根据一个以上的对象类型来决定如何虚化

CPP的虚函数机制实现的是single dispatch,即运行时绑定的函数是由作用的object类型单一决定的。 CPP不支持根据多个参数虚化(multiple dispatch)(重载只是根据静态类型重载)。

因此想要在CPP上实现multiple dispatch,可以用以下方法:

  1. 虚函数+ RTTI,在虚函数中针对传入的参数使用RTTI的typeid()
  2. 对所有支持的类型进行重载,并虚化重载函数。
  3. 自行模拟vtbl。

发表评论