zoukankan      html  css  js  c++  java
  • c++ 11 key note

    c++11
    c++11

    常数初始化,使用constexpr关键字

        constexpr in getNum(){return 4};
        int some_arr[getNum + 3];   
    

    初始化列表

    //std::initializer_list
    auto list = {1,2,35,57}; //list是一个initializer_list容器
    
    
    class InitClass
    {
        public:
        InitClass(std::initializer_list<int> list);
    }
    
    InitClass var = {0,12,33};
    
    //标准库容器
    
    std::vector<string> arr = {"apple","google","adobe"};
    

    统一初始化

        struct IDVO
        {
            string name;
            int age;
        }   
        // 自动将const char* 转成string
        IDVO var = {"Steven",667};
    
        IDVO getById()
        {
            return {"Jobs",78};
        }
        //统一初始化不会取代构造函数
    

    自动类型推导

    //使用auto关键字实现参数类型推导
    
    auto a = 1;       // a是int类型
    auto b = "hello"; // b是const char *
    
    int abc(int a,int b,int c)
    {
        return a + b + c;
    }
    auto bindFuc = std::bind(abc, std::placeholders::_1,std::placeholders::_2,std::placeholders::_3);
    
    //注意下面的写法
    
    auto myarr[2] = {1,2};//错误,编译器报错
    int myarr1[2] = {1,2};//正确
    decltype(myarr1) myarr2; //正确
    
    
    //还可以向下面这样使用
    
    std::vector<string> arr = {"apple","google","adobe"};
    
    for (auto ite = arr.begin();ite != arr.end(),ite++)
    {
    
    }
    
    
    //与decltype的配合用法
    
    int sint = 1;
    decltype(sint) bint = 4;//
    
    auto d = bint;//
    auto c = 0;
    
    decltype(c) e; //e为int类型
    decltype((c)) f = e; // f为int&类型,
    

    for循环

    int myarr3[3] = {1,2,3};
    
    for (int &x : myarr3)
    {
    
    }
    
    //
        vector<string> arrVec = {"apple","google","adobe"};
        for (const auto &x : arrVec)
        {
            printf("%s",x.c_str());
        }
    

    Lambda函数

    //一个lambda实例, 参数在()中定义;返回值-> ,无返回值时可以去掉 ;函数体{}
    
        auto sumFuc = [](int x,int y) ->int { return x+ y;};
        int ret = sumFuc(1,222);
    
    //以下定义了一个function
        std::function<int(int,int)> sumFuc1 =[](int x,int y) ->int { return x+ y;};
        int ret1 = sumFuc1(1,222);
    
    
        //[] 内部定义了一个lambda内部如何使用外部变量
        []  表示不能以任何形式使用外部变量
        [=] 表示任何被使用的外部参数将以传值形式加以使用
        [&] 表示任何被使用的外部参数将以引用形式加以使用
    
        //下面是一个错误的例子,lambda无法直接使用外部ret1变量
        auto sumfuc2 = [](int z)->int
        {
            return ret1 + z;
        };
        //下面这个写法就是对的
        auto sumfuc2 = [&](int z)->int
        {
            return ret1 + z;
        };
        //可以使用不同的传值方式比如,ret显示的以引用使用,ret1则是传值方式
    
        auto sumFunc3 = [&ret,ret1]()->int
        {
    
            return ret + ret1;
        };
    
        cocos2d-x中,很多地方可以使用lambda表示,如触摸的onTouchBegan方法我们可以这么写
            auto touchListener = EventListenerTouchOneByOne::create();
        touchListener->onTouchBegan = [](Touch *touch, Event *event)->bool
        {
            return true;
        };
    

    std::bind 和std::function

    std::function 可以绑定到全局函数/类静态函数,如果要绑定到类的实例的函数则使用std::bind;
    
    std::bind 可以绑定lambda表达式;
    
    注意 std::bind无法绑定重载函数(同名函数)
    
    -----
    

    nullptr和NULL

    //关键字nullptr用来将空指针和整数0区分开来;nullptr的类型是nullptr_t,而NULL依然被定义为0
    //比如有两个函数
    
    void foo(char *); //<1>
    void foo(int);    //<2>
    
    foo(nullptr) //调用<1>
    foo(0)   //调用 <2>
    
    //0依然可以代表空指针
    

    字符串

    c++11支持三种unicode编码方式:UTF-8;UTF-16和UTF-32. 新加入两种类型的字符类别char16_t和char32_t,以支持UTF-16和UTF-32

        const char str8[] = "c++11标准";
        int len = strlen(str8); // 11
    
        //u8表示char ;u表示char16_t,U表示char32_t
    
        const char16_t str16[] = u"c++11标准";
        std::u16string ss16(str16);  //引入u16string
        //获取u16string长度
        int l = ss16.length();  // 7
    
        //还可以用下面这个方法获取长度
        int l16 = sizeof(str16)/sizeof(str16[0]])
    
        // utf-8和utf-16的相互转化
            char str8_str[] = "hi墨白科技";
        std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> utf16conv;
        //char 转 u16
        u16string str16_str = utf16conv.from_bytes(str8_str);
        int l16 = str16_str.length();
        const char16_t *str16_ss =str16_str.c_str();
        // u16string转string
        string c8str = utf16conv.to_bytes(str16_ss);
    

    多线程

    //多线程
    std::thread t;
    
  • 相关阅读:
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车按键启动和蜂鸣器报警
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    asp中设置session过期时间方法总结
    asp中设置session过期时间方法总结
    ASP.NET关于Session_End触发与否的问题
  • 原文地址:https://www.cnblogs.com/howeho/p/4156479.html
Copyright © 2011-2022 走看看