c++11新特性
智能指针:不过多赘述,请参考智能指针篇章。
1,类型推导 auto decltype
auto
auto关键字的作用是推导出一个变量初始化表达式中变量的类型。
auto类型的推断发生在编译时,所以出现无法推断的情况时编译器会报出编译错误。
没有初始化的变量是不能用auto的,因为编译器需要赋值操作符右边的表达式来推断auto代表的类型。
数组也不能声明为auto类型。
【例】:vector<int> vec;
vec.push_back(5);
vec.push_back(5);
vec.push_back(5);
auto it = vec.begin();
decltype关键字与auto相反,它不需要给变量初始化,而是将别的变量的类型推导出来并拷贝给当前的变量。
decltype的一个常见用法是获取类成员的类型来定义其他变量。
【例】:vector<int> vec(3,0);
typedef decltype(vec.begin()) ItType;
ItType it;
for( it = vec.begin(); it != vec.end(); it++ )
{
cout<<*it<<" ";
}
2,区间迭代
简化了 遍历数组和容器的循环写法
【例】:int arr[5] = { 0,1,2,3,4 };
for( int num : arr )
{
cout<<num<<" ";
}
vector<int> vec = { 0,1,2,3,4 };
for( int num : vec )
{
cout<<num<<" ";
}
3,初始化列表
在c++98标准中,只有数组可以使用花括号包含的初始化列表方便地初始化,
而在c++11中,我们可以直接初始化vector和其他容器。
【例】:std::vector<int> vec{ 10,20,30,40,50,60 };
std::map<int , string> m = { {1,"ling"},{2 ,“yiyi”} };
4,Lambda表达式
匿名函数又叫Lambda表达式
【例】:vector<int> vec = { 3,4,5,6,7,8,9,3,5,4,6 };
sort( vec.begin() , vec.end() , [](int a , int b){ return a > b; } );
5,override 和 final
override,我们知道在写派生类时,必须保证函数签名与基类中的虚函数一致
所以override就是防止签名不一致,如果签名不一致,编译器会报错误。
final的两个用途,一是可以阻止从类继承出派生类,二是可以阻止一个虚函数在派生类中被重新实现