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};
浙公网安备 33010602011771号