C++11新特性

本人菜鳥一枚,如果內容有誤,請大家幫忙矯正,請多多關照!謝謝!  

 因爲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:用來代替NULLnullptr是強類型,防止出現一些二義性

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  
}

二、標準庫

  1. 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");  
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章