本人菜鳥一枚,如果內容有誤,請大家幫忙矯正,請多多關照!謝謝!
因爲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<double>& 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"); }