目前距离C++11出版时间大概有7年了,但可能仍然有很多人还不熟悉它常见的新特性,这些新特性使得代码更加简洁易懂。下面我就大致总结一下有哪些新特性吧!
auto关键字
实际上早在C++98中就有auto关键字,但当时它表示的是临时变量的语义,而在C++11中auto表示自动推导类型。例如之前定义变量可能如下
int a = 12;
long b = 15;
string c = "c";
而通过auto关键字,直接可以自动推导出abc的类型,用法如下
auto a = 12;
auto b = 15;
auto c = "c";
特别是类型比较长的时候非常方便,例如
for (auto it = v.begin(); it != v.end(); it++) {
cout << *it << endl;
}
decltype关键字
decltype是根据变量类型推导获取变量的类型,它引入C++11是为了泛型编程而设计的。例如
auto a = 12;
auto b = 15;
typedef decltype(a * b) TYPE;
TYPE t = a * b;
cout << t << endl;
通过decltype推断函数返回值的类型
auto Multi(int a, int b) -> decltype(a * b) {
return a * b;
}
array数组
在C++的STL中,有vector代替数组,并且功能强大,但是它的效率比较低,而普通的数组效果可以,但使用起来不方便。针对这种缺点,C++11推出了array,长度固定且也是用栈分配内存空间,效率跟普通数组相同,但功能更强大。如下代码
arrayarr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 通过data()方法获取首地址
int *p = arr.data();
cout << p[5] << endl;
// size() 获取数组大小
cout << arr.size() << endl;
// 使用begin()和end()方法求和
auto sum = accumulate(arr.begin(), arr.end(), 0);
cout << sum << endl;
// empty() 判断数组是否空
cout << arr.empty() << endl;
// max_size() 输出数组设置的最大size
cout << arr.max_size() << endl;
// front() 返回第一个元素
cout << arr.front() << endl;
// back() 返回最后一个元素
cout << arr.back() << endl;
// fill 填充相同的n个元素
arrayarr1;
arr1.fill(1);
// swap() 线性操作交换所有元素值
arr.swap(arr1);
// get 获取对应下标值
cout << get<5>(arr) << endl;
nullptr关键字
nullptr的引入是为了解决之前C++ NULL的二义性问题,因为NULL可以代表0。如下例子
void fun(int a) {
cout << a << endl;
}
void fun(int *p) {
assert(p != NULL);
cout << *p << endl;
}
int main() {
fun(0);
return 0;
}
如果用原来的C++98标准编译,会报错,因为有歧义,不知道会调用哪个函数。引入nullptr后,它本身不能代表0。
for循环语句
以前的for循环只能for(int i = 0; i < n; i++),而C++11的for遍历更加简洁,如下
int a[5] = {1, 2, 3, 4, 5};
for (auto x : a) {
cout << x << endl;
}
tuple可变元组
C++11中的tuple是一个n元的可变元组,它相当于有n个元素的结构体,并提供get()方法来获取某个下标对应的元素值。如下代码
auto tp = make_tuple(1, 2, "hello", 3.14);
auto v1 = get<1>(tp);
auto v2 = get<3>(tp);
cout << v1 << " " << v2 << endl;
本文暂时就介绍这些新特性,还有更多的如智能指针,多线程,lamda表达式等特性大家自己可以进一步学习了解哦!
网友评论