1、支持模板...,可以传入多个不同类型,参数个数不定
2、尖括号改进,之前要区分‘> >’和‘>>’,现在可以直接用>>
3、加入nullptr,用于区分0,对于函数重载有用
4、auto,自动推断类型
5、lambda
6、对变量初始化可以直接用大括号{1,2,3},,背后涉及到initialzer_list,把大括号里数据拆分出来一一传入
7、explicit,针对构造函数一个以上实参,明确匹配某一类型,编译器不要自作聪明类型转换,如复数:1和1+0i不同
8、for循环,for(a:b){ } 从b中取出一个一个放到a中
9、=default,=delete:如果自己定义有构造函数ctor,那么编译器就不会给你一个默认构造函数default ctor
如果加上=default,就使用默认构造函数default ctor
10、模板别名,使可以利用别名和传参数,而使用#define或typedef时,就得确定参数类型,就没有模板的特性 =
using Vec = std::vector<T,MyAlloc<T>>;
Vec<int> coll;
不过使用别名没有模板特化和偏特化,
11、noexcept不抛出异常
void foo() noexcept;这个函数不抛出异常
对于异常发生,如果没有被处理,会一直向上层查找这个异常属于哪里,异常最终没有被处理就会调用std::abort()
12、override,用于继承使虚函数的重写,派生类函数重写继承来的基类的虚函数,并声明override,
当重写时函数接口写错会帮你报错说没有重写到
13、final,这个类、结构体不能用于继承
struct Base final { }
用于虚函数,这个虚函数不能被覆写
virtual void f() final;
14、decltype,可以使不用知道容器使用的具体类型
map<string,float> coll;
decltype(coll)::value_type elem;
上面使用了decltype,不然得这么写
map<string,float>::value_type elem;
15、lambdas
[]{}形式:
auto p=[]{std::cout<<"hello"<<std::endl;};
调用:p();
[](){}形式:
[]放外部变量,是传值还是引用
()里放的是定义在{}使用到的变量
int id=0'
auto f=[id]()mutable{ cout<<id<<endl; ++id;}//如果没有使用mutable,id不能++
对于[=,&y]使用=,表示可以使用外部所有的变量
16、右值 move
左值通过move可以用于右值引用,相当于浅拷贝,指针指向原来的东西,原来的指针失效,不能对原来的左值在操作
右值引用可以提高效率