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


你可能感兴趣的:(C++11的新特性)