Cocos2dx是用C++11編寫的,由於之前工作中並沒有用到這部分。這裏對C++11新特性在Cocos2dx中使用較多的地方做一下歸納。
C++11FAQ:http://www.stroustrup.com/C++11FAQ.html
一、新的關鍵字及語法
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
- };
range for:只要定義了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
- }
lambad表達式:主要應用時標書某些具有簡單行爲的函數,(cocos2dxz中常用)
- auto onTouchEvent = [&](EventListener* l) -> bool { // Return true to break
- EventListenerTouchOneByOne* listener = static_cast<EventListenerTouchOneByOne*>(l);
- // Skip if the listener was removed.
- if (!listener->_isRegistered)
- return false;
- event->setCurrentTarget(listener->_node);
- ...
- }
二、標準庫
1.std::function與std::bind
std::function :可以定義類似函數指針的類型
std:bind:可以方便的綁定類的成員函數
這個常在cocos2dx中的回調函數中使用
- std::function<void(const std::vector<Touch*>&, Event*)> onTouchesBegan;
- std::function<void(const std::vector<Touch*>&, Event*)> onTouchesMoved;
- std::function<void(const std::vector<Touch*>&, Event*)> onTouchesEnded;
- std::function<void(const std::vector<Touch*>&, Event*)> onTouchesCancelled;
- // new callbacks based on C++11
- #define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
- #define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
- #define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
- #define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)
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");
- }
C++11中還有很多其他的新特性,如右值引用與move語義,std::move,無序容器(unordered_map...), 初始化列表等;想更深入的瞭解請查看c++11FAQ