C++作为一门“古老”的语言,标准也在不断更新制定中,也在与时俱进的进行更新。从第一版C++标准在1998年制定,到现在二十多个年头,期间2003年在C++98标准上进行一次修订,称为C++98/03标准,2011年更新C++11标准,这是一次颠覆性的更新,修正了600个左右C++语言缺陷,添加了约140个语言新特性。2014年更新C++14标准,在C++11基础上又进行了部分升级和修订,2017年更新C++17标准。
本文对C++11常用的一些新特性进行说明:
- 1.auto
- 2.decltype
- 3.auto+decltype组合使用
- 4.使用using定义别名
- 5.for循环新用法
- 6.函数式编程lambda
一、auto
auto只是一个占位符,在编译期间会被真正的类型所替代,由编译器进行类型推导。
auto n = 10; ->int (整型默认是int)
auto f = 12.8; ->double(小数类型默认是double)
auto p=&n; ->int*(引用内部也是指针实现)
auto str="helloworld"; ->const char*
推导的时候不能产生二义性:auto n=10, s=""; 产生报错。变量必须马上初始化,否则无法推导。
- auto不能在函数参数中使用
- auto不能用于类的非静态成员变量
- auto不能定义数组
- auto不能用于模板函数
auto常用于定义SLT迭代器
std::vector<int> vec;
auto it = vec.begin();
二、decltype
decltype不用必须初始化,保留原始表达式的类型,和=号右侧的值没有关系,使用方式
decltype(表达式) 变量名 = 值;
int x = 100;
decltype(x) y = 10;
三、auto+decltype组合使用
decltype作为返回值类型,进行返回值类型后置
auto func(T val) -> decltype(ret(val))
{
return ret(val);
}
四、使用using定义别名
using覆盖了typedef的全部功能,并可以定义模板,使用赋值语法。
using uint_t = unsigned int;
五、for循环新用法
使用基于范围的循环方式,类似shell中的for((i in list))
std::vector<int> vec;
for(auto item : vec){}
如果冒号后面的是函数表达式,只会被执行一次
六、函数式编程lambda
auto f = [](int a)->int{return a;};
[]内是捕获值,也就是外部区域向内部区域传入的参数,内部可以直接使用。(int a)是函数参数,->int表示返回值是int,在函数内部可以自动推导出返回值的时候,->int可以省略不写。{}内部是函数体。
应用之一是我们在使用std::sort进行排序的时候,可以进行比较函数定义
std::vector<LineItem> left_line_list;
auto SortByY = [](LineItem line1, LineItem line2)->bool{return line1.y1 < line2.y1; };
std::sort(left_line_list.begin(), left_line_list.end(), SortByY);
std::sort是C++中的排序函数,集中了快速排序,归并排序和堆排序等,qsort是C提供的排序函数,只实现了快速排序。使用lambda方式进行编程,能使代码更加规整,统一。
外部作用于传入参数说明
- [] 不传入任何变量
- [&] 按引用传入所有变量
- [=] 按值传入所有变量
- [=,&i]按值传入所有变量,i按引用传入
- [i] 按值只传i变量
- [this]传入this指针,访问外部类区域成员变量和成员函数
最后总结,C++各种的新特性为C++的开发注入了新的活力,也在不断与时俱进。今后开发中可以更多的使用新特性。