美文网首页程序园程序员
C++编程丨C++11常用新特性总结,学习编程语言新特性

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

作者: 1cbd7f94d3ea | 来源:发表于2019-04-29 15:28 被阅读43次

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

    相关文章

      网友评论

        本文标题:C++编程丨C++11常用新特性总结,学习编程语言新特性

        本文链接:https://www.haomeiwen.com/subject/rndlgqtx.html