Effective C++ 读书笔记(39-45)

  条款三十九:明智而审慎的使用private继承

    1.C++裁定凡是独立(非附属)对象都必须有非零大小。

class Empty{};//没有数据,所以其对象应该不使用任何内存

class HoldAnInt
{
 private:
        int x;
        Empty e;       
 
}
//你会发现sizeof(HoldAnInt)>sizeof(int);在大多数编译器中sizeof(Empty)获得1.但是还会有默认的内存对其操作。

    2.空白基类最优化

class HoldAnInt:private Empty
{
  private:
        int  x;
}//几乎可以确定sizeof(HoldsAnInt)==sizeof(int)

    3.和上面的复合不同,private继承可以造成empty base最优化。这对致力于“对象尺寸最小化”的程序库开发者而言,可能很重要。

  条款四十:明智而审慎地使用多重继承

  条款四十一:了解隐式接口和编译期多态

    1.面向对象世界总是以显式接口和运行期多态解决问题。

    2.隐式接口不基于函数签名式,而是由有效表达式组成。

template<typename T>
void doProcessing(T& w)
{
     if(w.size()>10 && w!=someNastyWidget)  //表达式
       .....
}

    3.对classes而言接口是显式的,以函数签名为中心。多态则是通过virtual函数发生于运行期。

    4.对template参数而言,接口是隐式的,奠基于有效表达式。多态则是通过template具现化和函数重载解析发生于编译期。

  

  条款四十二:了解typename的双重意义

    1.任何时候当你想要在template中指涉一个嵌套从属类型名称,就必须在紧邻它的前一个位置放上关键字typename

template<typename C>
void print2nd(const C&container)
{
  if(container.size()>=2)
  {
     typename C::const_iterator iter(container.begin());
      ....
  }
}

    2.声明template参数时,前缀关键字class和typename可互换。

    3.请使用关键字typename标识嵌套从属类型名称;但不得在base class lists(基类列)或member initialization list(成员初值列)内以它作为base class 修饰符。

  条款四十三:学习处理模板化基类内的名称

  

  条款四十四:将于参数无关的代码抽离templates

  条款四十五:运用成员函数模板接收所有兼容类型

原文地址:https://www.cnblogs.com/xxiaoye/p/3582162.html