C++11标准

1,右值引用和move语义
  
  C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意是想把参数push_back进去就行了,通过std::move,可以避免不必要的拷贝操作。
  std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝所以可以提高利用效率,改善性能.。
  对指针类型的标准库对象并不需要这么做。

2,常数表达式

  引入constexpr允许用户保证函数或者对象构建时编译为常数
  例如 constexpr int getfive(){return 5;}
  constexpr double m_PI = 3.1415926;

3,外部模板

  减少编译时重复的函数实例化 
  template void fun<int>(int); // 显式地实例化
  extern template void fun<int>(int); // 外部模板的声明

4,类型推导auto关键字使用

  auto getType = 1.0;

5,Lambda表达式

  auto getType=[](){return 1.0;};
  [] 没有任何函数对象参数。
  [=] 函数体内可以使用 Lambda 所在范围内所有可见的局部变量(包括 Lambda 所在类的 this),并且是值传递方式(相
    当于编译器自动为我们按值传递了所有局部变量)。
  [&] 函数体内可以使用 Lambda 所在范围内所有可见的局部变量(包括 Lambda 所在类的 this),并且是引用传递方式
  (相当于是编译器自动为我们按引用传递了所有局部变量)。
  [this] 函数体内可以使用 Lambda 所在类中的成员变量。
  [a] 将 a 按值进行传递。按值进行传递时,函数体内不能修改传递进来的 a 的拷贝,因为默认情况下函数是 const 的,要
    修改传递进来的拷贝,可以添加 mutable 修饰符。
  [&a] 将 a 按引用进行传递。
  [a,&b] 将 a 按值传递,b 按引用进行传递。
  [=,&a,&b] 除 a 和 b 按引用进行传递外,其他参数都按值进行传递。
  [&,a,b] 除 a 和 b 按值进行传递外,其他参数都按引用进行传递。

6,关键字decltype将变量的类型声明为表达式指定的类型。

  auto f2 ( double a, int b) -> decltype(a+b){ return a+b};

7,虚函数、纯虚函数、空指针nullptr

8,强类型枚举

  enum Status1{Ok, Error};
  //enum Status2{Ok, Error}; // Err, 导致命名冲突, Status1已经有成员叫Ok, Error
  // 在C++11中,强类型枚举解决了这些问题
  enum class StatusN1 {Ok, Error};
  enum struct StatusN2 {Ok, Error};

posted @ 2021-01-25 09:08  浪里小绿叶  阅读(485)  评论(0)    收藏  举报