C++11新特性

/ 0评 / 1

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常用的一些新特性进行说明:

一、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方式进行编程,能使代码更加规整,统一。

外部作用于传入参数说明

最后总结,C++各种的新特性为C++的开发注入了新的活力,也在不断与时俱进。今后开发中可以更多的使用新特性。