首页 > 代码库 > c++ 11 key note

c++ 11 key note

<style></style>

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

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

初始化列表

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    int l = ss16.length();  // 7    //还可以用下面这个方法获取长度    int l16 = sizeof(str16)/sizeof(str16[0]])

多线程

//多线程std::thread t;

c++ 11 key note