C++11/14新特性

本文介绍C++11/14标准的新特性。


统一初始化

C++11中支持对数组、STL容器等进行统一初始化,在{}中包含所需要初始化的值。

1
2
3
4
5
6
7
8
int *pi = new int[5]{1, 2, 3, 4, 5};
class A {
int arr[3];
public:
A(int x, int y, int z) : arr{x, y, z} { };
}
vector<int> vi{1, 2};
f({foo, bar});


initializer_list

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
initializer_list<int> test(const initializer_list<int> &v) {
for (auto item : v) {
cout << item << endl;
}
return {1, 2, 4};
}
int main() {
test({1, 2, 3});
return 0;
}

auto

在C++03中,我们声明变量时必须指定类型,在C++11中可以使用auto关键字,auto是自动类型推导,在编译时进行类型推导,不会对程序的运行效率造成影响。

1
2
3
4
5
auto a = 2;
auto b = 2;
for (vector<int>::const_iterator it = v.begin(); it != v.end(); ++it)
for (auto it = v.begin(); it != v.end(); ++it)


decltype

decltype允许我们从一个变量或表达式中得到类型,例如:

1
2
int x = 3;
decltype(x) y = x;


nullptr

nullptr是为了解决原来C++中NULL的二义性问题而引进的一种新的类型,因为NULL实际上代表的是0,


序列for循环

在C++中for循环可以使用类型Java的简化的for循环,用于遍历数组、容器、string以及迭代器。

1
2
3
4
map<string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
for (auto item : m) {
cout << item.first << " " << item.second << endl;
}


Lambda表达式

lambda表达式可以创建并定义匿名的函数对象,以简化编程工作,其语法如下:
[函数对象参数] (操作符重载函数参数) -> 返回值类型{函数体}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> vi{1, 2, 3, 4, 5};
int a = 2, b = 1;
for_each (vi.begin(), vi.end(), [a](int &x){cout << x+a << endl;});
for_each (vi.begin(), vi.end(), [=](int &x){static int y=1; x*=a*b+y;});
for_each (vi.begin(), vi.end(), [=](int &x)->int{return x*a*b;});
return 0;
}


变长参数模板

C++11中支持tuple元祖,可以传入多个不同类型的数据。

1
2
tuple<int, int, int> bar = make_tuple(10, 20, 30);
cout << get<2>(bar) << endl;


final

final关键字不允许该类派生其他子类。

1
2
3
4
5
6
7
class A final { // 不可被继承
public:
A() {}
void testA() const {
cout << "testA" << endl;
}
};

override

overide关键字不允许子类函数覆盖父类函数。

1
2
3
4
5
6
7
8
9
class Base
{
virtual void f(int);
};
class Derived : public Base
{
virtual void f(float) override; // Error
};


参考资料:
C++11/14新特性快速概览
30分钟了解C++11新特性