程序园程序员

C++编程丨C++11常用新特性总结,学习编程语言新特性

2019-04-29  本文已影响43人  1cbd7f94d3ea

目前距离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表达式等特性大家自己可以进一步学习了解哦!

上一篇下一篇

猜你喜欢

热点阅读