c++11相对c++99引入了很多新特性(很多特性是从boost库引入的),详细说明可以查看C++ primer 5
下面列出一些个人认为比较实用的新特性:
- 智能指针
将boost库的shared_ptr和unique_ptr引入到c++标准库 - 范围for语句
语法如下(java类似):
|
|
示例代码:
|
|
- auto关键字
支持使用auto关键字自动推断变量类型 - lambda表达式
一个lambda表达式表示一个可调用的代码单元(类似于一个匿名函数)。与函数类似,lambda表达式具有一个返回类型,一个参数列表和一个函数体。其具有如下形式:
capture list->return type {function body}
其中capture list为捕获的参数列表,即为函数外的变量,通常为空;parameter list为参数列表,可以省略;其中return type为返回值类型,可以省略。
示例代码:
|
|
- 使用 = default生成默认构造函数
使用场景:在我们即需要其它形式的构造函数(通常为拷贝构造函数),也需要默认的构造函数时。
示例代码:
|
|
移动语义
为了支持移动操作,新标准引入了一种新的引用类型——右值引用。所谓右值引用就是必须绑定到右值的引用。通过&&来获取右值引用。右值引用有一个重要的性质,只能绑定到一个将要销毁的对象(如形参),因此,我们可以自由地将一个优质引用的资源“移动”到另一个对象中
例子:
int i = 1;
int &&ri = i 42; //因为i 42 会生成个临时的变量,将其移动到ri上
int &&ri1= i; //错误,不能将一个右值引用绑定到一个左值上。这种其实可以通过move函数来实现,但是使用这种操作后以为着不能再使用i了,所有对i的操作应该变为对ri1操作,有点像auto_ptr指针
合适使用右值引用能减少不必要的对象构造和析构,提高程序运行的效率,这边就不继续展开了
另一个与右值引用相关的概念是move函数:move函数告诉编译器,我们有一个左值,但是我们希望像一个右值一样处理他(需要由调用者保证后续不再使用这个左值,因为其会被销毁)
此外,还有移动构造函数和移动赋值函数正则表达式
c++11引入了regex类来处理正则表达式- 其它
还有很多其它的新特性,如随机数,概率分布,final关键字,override指示符(尾置),可变参数模版,mem_fn类膜拜等等