default/delete 控制默认函数
  在我们没有显式定义类的复制构造函数和赋值操作符的情况下,编译器会为我们生成默认的这两个函数:
  默认的赋值函数以内存复制的形式完成对象的复制。
  这种机制可以为我们节省很多编写复制构造函数和赋值操作符的时间,但是在某些情况下,比如我们不希望对象被复制,
  在之前我们需要将复制构造函数和赋值操作符声明为private,现在可以使用delete关键字实现:
  class X {
  // …
  X& operator=(const X&) = delete;   // 禁用类的赋值操作符
  X(const X&) = delete;
  };
  显式地使用default关键字声明使用类的默认行为,对于编译器来说明显是多余的,但是对于代码的阅读者来说,使用default显式地定义复制操作,则意味着这个复制操作是一个普通的默认的复制操作。
  override /final 强制重写/禁止重写虚函数
  派生类中可以不实现基类虚函数,也可以实现,但不使用virtual关键字;
  这很容易给人造成混淆,有时为了确认某个函数是否是虚函数,我们不得不追溯到基类查看;
  C++11引入了两个新的标识符: override和final
  override,表示函数应当重写基类中的虚函数。(用于派生类的虚函数中)
  final,表示派生类不应当重写这个虚函数。(用于基类中)
  struct B {
  virtual void f();
  virtual void g() const;
  virtual void h(char);
  void k();      // non-virtual
  virtual void m() final;
  };
  struct D : B {
  void f() override;     // OK: 重写 B::f()
  void g() override;     // error: 不同的函数声明,不能重写
  virtual void h(char);  // 重写 B::h( char ); 可能会有警告
  void k() override;     // error: B::k() 不是虚函数
  virtual void m();       // error: m()在基类中声明禁止重写
  };
  有了这对兄弟,我们的虚函数用起来更为安全,也更好阅读;
  委托构造函数 Delegating constructors
  在C++98中,如果你想让两个构造函数完成相似的事情,可以写两个大段代码相同的构造函数,或者是另外定义一个init()函数,让两个构造函数都调用这个init()函数。例如:
  class X {
  int a;
  // 实现一个初始化函数
  validate(int x) {
  if (0<x && x<=max) a=x; else throw bad_X(x);
  }
  public:
  // 三个构造函数都调用validate(),完成初始化工作
  X(int x) { validate(x); }
  X() { validate(42); }
  X(string s) {
  int x = lexical_cast<int>(s); validate(x);
  }
  // …
  };
  这样的实现方式重复罗嗦,并且容易出错。