本人菜鸟一枚,如果内容有误,请大家帮忙矫正,请多多关照!谢谢!
因为Cocos2D-X3.x中引入了大量C++11的特性,为了更好的理解引擎代码需要归纳一下C++11的新特性。
转载至http://blog.csdn.net/ls1122/article/details/38339851
一、新的关键字及语法
lambad:
C++ 11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。
auto function=[](){cout<<"hello world";}; function();
这就是一个简单的lambda函数,function通过auto声明变量,而调用function就调用了这个lambda函数。
举一个列子,menu,假如不用lambad表达式
auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback,this)); void HelloWorld::menuCloseCallback(Object* sender) { Director::getInstance()->end(); }
如果用了就可以简化为
auto callEnd = [](Object* sender) { Director::getInstance()->end();//直接在这里添加按钮要调用的代码 }; auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png",callEnd);
其中
[]没有使用任何函数对象参数。
[&] 函数体内可以使用Lambda所在作用范围内所有可见的局部变量,引用传递。
[=] 函数体内可以使用Lambda所在作用范围内所有可见的局部变量,值传递。
nullptr:用来代替NULL,nullptr是强类型,防止出现一些二义性
void f(int); //#1 void f(char *);//#2 //C++03 f(0); //二义性 //C++11 f(nullptr) //无二义性,调用f(char*)
auto:根据上下文自动类型推导,(在使用STL时非常方便), (decltype与此相反,从变量或表达式中获取类型)
bool AppDelegate::applicationDidFinishLaunching() { // initialize director auto director = Director::getInstance(); // Director* auto glview = director->getOpenGLView(); // GLView* ... }
override:派生类重写基类的虚函数时,在函数的声明中加上override(非必须), 这样可在编译时检测出对基类函数的错误重写
struct B { virtual void f(); virtual void g() const; virtual void h(char); void k(); // not virtual }; struct D : B { void f() override; // OK: overrides B::f() void g() override; // error: wrong type virtual void h(char); // overrides B::h(); likely warning void k() override; // error: B::k() is not virtual };
final:可用来修饰基类的虚函数,表示该函数不可被派生类重写即override
struct B { virtual void f() const final; // do not override virtual void g(); }; struct D : B { void f() const; // error: D::f attempts to override final B::f void g(); // OK };
rangefor:只要定义了begin(), end()即有iterator
void f(vector& v) { for (auto x : v) cout << x << '\n'; for (auto& x : v) ++x; // using a reference to allow us to change the value }
二、标准库
std::function
std::function是一种通用、多态的函数封装
std::function的实例可以对任何可以调用的目标进行存储、复制、和调用操作,这些目标包括函数、lambda表达式、绑定表达式、以及其它函数对象等。
2. std:bind:
可以方便的绑定类的成员函数
这个常在cocos2dx中的回调函数中使用
2.std::thread
Cocos2dx引擎的核心仍然是一个单线程的死循环(UI线程),在处理一些比较耗时的工作,如网络通信,纹理资源,音视频资源等,为防止界面出现卡顿,最好还是另开线程(Worker线程)。而在3.2的版本中并未发现pthread的支持,原来是C++11的标准库中已经有了std::thread。下面给出一个简单示例:
bool HelloWorld::init() { if ( !Layer::init() ) { return false; } std::thread t1(&HelloWorld::myThread,this);//创建一个分支线程,回调到myThread函数里 t1.join(); //t1.detach(); log("in major thread");//在主线程 return true; } void HelloWorld::myThread() { log("in my thread"); }