您的位置:首页 > 编程语言 > C语言/C++

C++11新特性

2015-03-29 12:17 162 查看
本人菜鸟一枚,如果内容有误,请大家帮忙矫正,请多多关照!谢谢!
因为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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++11的新特性