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;
posted @ 2014-12-10 22:23  haroel  阅读(347)  评论(0编辑  收藏  举报