c++ 11 key note
常数初始化,使用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;