zoukankan      html  css  js  c++  java
  • C++ 11特性

    1.auto:自动类型推导

        编译时对变量进行类型推导,不会对程序的运行效率造成影响;

        不会影响编译速度,因为编译时也要右侧推导,然后判断与左侧是否匹配;

        通过初始化表达式进行类型推导。

        1. auto a;  // error  如果没有初始化表达式,就无法确定a的类型
    
        2. auto i = 1;
    
        3. auto d = 1.0;
    
        4. auto str = "hello world";
    
        5. auto ch = 'a';
    
        6. auto func = less<int>();
    
        7. vector<int> iv;
           auto ite = iv.begin();
    
        8. auto p = new foo();  // 对自定义类型进行类型推导
    
        9. 模板中应用:
           template <typename Product, typename Creator>
           void processProduct(const Creator& creator) {
               Product* val = creator.makeObject();
           }
           
           // 使用auto
           templete <typename Creator>
           void processProduct(const Creator& creator) {
               auto val = creator.makeObject();
           }

    2. decltype:从一个变量或表达式中得到类型

    int x = 3;
    decltype(x)y = x;
    
    // 应用
    template <typename Creator>
    auto processProduct(const Creator& creator) -> decltype(creator.makeObject()) {
        auto val = creator.makeObject()
    }

    3. nullptr:空指针常量

    #ifdef __cplusplus ---简称:cpp c++ 文件
    #define NULL 0
    #else
    #define NULL ((void *)0)
    #endi

        解决C++中NULL的二义性,因为NULL实际上代表0;

        C++中不能将void *类型的指针隐式转换成其他指针类型。

    4. 序列for循环

        遍历数组、容器、string以及由begin和end函数定义的序列(即有Iterator)

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

    5. Lambda表达式

        创建并定义匿名的函数对象,简化编程。

    // 语法
    // [函数对象参数](操作符重载函数参数)->返回值类型{函数体}
    vector<int> iv{5, 4, 3, 2, 1};
    int a = 2, b = 1;
    
    for_each(iv.begin(), iv.end(), [b](int &x){cout<<(x+b)<<endl;});  // (1)
    
    for_each(iv.begin(), iv.end(), [=](int &x){x *= (a+b);});  // (2)
    
    for_each(iv.begin(), iv.end(), [=](int &x)->int{return x*(a+b);});  // (3)

    []:可取得的全局变量

        (1):b指函数可得到在Lambda表达式外的全局变量

        (2)(3):=是可取得所有的外部变量

    ():每次调用函数时传入的参数

    ->后加上的是Lambda表达式返回值的类型

    6. 变长参数的模板

    // pair可使用make_pair构造
    auto p = make_pair(1, "C++ 11");
    
    // 变长参数模板,tuple(1个N元组)
    auto t1 = make_tuple(1, 2.0, "C++ 11");
    auto t2 = make_tuple(1, 2.0, "C++ 11", {1, 0, 2});
    
    // Print函数
    template<typename head, typename... tail>
    void Print(Head head, typename... tail) {
        cout<<head<<endl;
        Print(tail...);
    }
    // Print中可传入多个不同种类的参数
    Print(1, 1.0, "C++ 11");

    7. 智能指针

        C++11之后智能指针分为了三种:shared_ptr, unique_ptr, weak_ptr 

        C++11之后的智能指针的构造函数都有explict关键词修饰,表明它不能被隐式的类型转换。

    shared_ptr<int> p1 = new int(1024);  //这种是不行的,因为等号右边是一个int*的指针,因为有explict修饰,所以它不能被隐式的转换为shared_ptr<int>的类型
    shared_ptr<int> p2(new int(1024));   //这种是直接采用了初始化的形式
  • 相关阅读:
    Hadoop命令手册
    编程算法
    综合8种子排序算法总结和比较
    android 创建一个新的每次project什么时候 请问自己主动 参加 V7依赖?
    【JDBC】java PreparedStatement操作oracle数据库
    【cocos2dx 加载资源目录】
    Project Euler:Problem 39 Integer right triangles
    矿Java开发学习之旅------&gt;Java排序算法经典的二分法插入排序
    [React Intl] Render Content with Placeholders using react-intl FormattedMessage
    [React Intl] Install and Configure the Entry Point of react-intl
  • 原文地址:https://www.cnblogs.com/mayfly-xlc/p/9663606.html
Copyright © 2011-2022 走看看