c++11新特性

c++11相对c++99引入了很多新特性(很多特性是从boost库引入的),详细说明可以查看C++ primer 5
下面列出一些个人认为比较实用的新特性:

  • 智能指针
    将boost库的shared_ptr和unique_ptr引入到c++标准库
  • 范围for语句
    语法如下(java类似):
1
2
for(declaration: expression)
statement

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
using namespace std;
int main() {
int a[3] = {1,2,3};
//string a("Hello");
for(auto var: a)
{
cout << var << endl;
}
return 0;
}
  • auto关键字
    支持使用auto关键字自动推断变量类型
  • lambda表达式
    一个lambda表达式表示一个可调用的代码单元(类似于一个匿名函数)。与函数类似,lambda表达式具有一个返回类型,一个参数列表和一个函数体。其具有如下形式:
    capture list->return type {function body}
    其中capture list为捕获的参数列表,即为函数外的变量,通常为空;parameter list为参数列表,可以省略;其中return type为返回值类型,可以省略。

示例代码:

1
2
auto f = [](int a, int b)->int{ return a+b;};
cout << "2+3=" << f(2,3) << endl;
  • 使用 = default生成默认构造函数
    使用场景:在我们即需要其它形式的构造函数(通常为拷贝构造函数),也需要默认的构造函数时。
    示例代码:
1
2
3
4
5
6
7
Class Base{
public:
Base() = default;
Base(int sz): size(sz) {}
private:
int size;
};
  • 移动语义
    为了支持移动操作,新标准引入了一种新的引用类型——右值引用。所谓右值引用就是必须绑定到右值的引用。通过&&来获取右值引用。右值引用有一个重要的性质,只能绑定到一个将要销毁的对象(如形参),因此,我们可以自由地将一个优质引用的资源“移动”到另一个对象中
    例子:
    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类膜拜等等
本站总访问量