http://www.52php.cn/article/p-qmdcjoko-sw.html
Cocos2dx是用C++11编写的,由于之前工作中并没有用到这部分。这里对C++11新特性在Cocos2dx中使用较多的地方做一下归纳。
C++11FAQ:http://www.stroustrup.com/C++11FAQ.html
一、新的关键字及语法
nullptr:用来代替NULL,nullptr是强类型,防止出现一些二义性
- voidf(int);
- char*);
-
- f(0);
- //C++11
- f(nullptr)
auto:根据上下文自动类型推导,(在使用STL时非常方便),(decltype与此相反,从变量或表达式中获取类型)
boolAppDelegate::applicationDidFinishLaunching(){
-
- autodirector=Director::getInstance();
- autoglview=director->getOpenGLView();
- ...
- }
override:派生类重写基类的虚函数时,在函数的声明中加上override(非必须),这样可在编译时检测出对基类函数的错误重写
structB{
- virtualvoidf();
- voidg()const;
- voidh(char);
- voidk();
- };
- structD:B{
- voidf()override;
- voidg()override;
- char);
- voidk()override;
- };
final:可用来修饰基类的虚函数,表示该函数不可被派生类重写即override
voidf()constfinal;
- voidg();
-
- structD:B{
- const;
- voidg();
- };
range for:只要定义了begin(),end()即有iterator
voidf(vector<double>&v)
- {
- for(autox:v)cout<<x<<'n';
- for(auto&x:v)++x;
- }
lambad表达式:主要应用时标书某些具有简单行为的函数,(cocos2dxz中常用)
autoonTouchEvent=[&](EventListener*l)->bool{
- EventListenerTouchOneByOne*listener=static_cast<EventListenerTouchOneByOne*>(l);
- //Skipifthelistenerwasremoved.
- if(!listener->_isRegistered)
- returnfalse;
- event->setCurrentTarget(listener->_node);
-
二、标准库
1.std::function与std::bind
std::function :可以定义类似函数指针的类型
std:bind:可以方便的绑定类的成员函数
这个常在cocos2dx中的回调函数中使用
std::function<void(conststd::vector<Touch*>&,Event*)>onTouchesBegan;
- std::function< std::function<
//newcallbacksbasedonC++11
- #defineCC_CALLBACK_0(__selector__,__target__,...)std::bind(&__selector__,##__VA_ARGS__)
- #defineCC_CALLBACK_1(__selector__,std::placeholders::_1,##__VA_ARGS__)
- #defineCC_CALLBACK_2(__selector__,std::placeholders::_2,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18.461538314819336px; margin:0px!important; padding:0px 3px 0px 10px!important"> #defineCC_CALLBACK_3(__selector__,std::placeholders::_3,##__VA_ARGS__)
2.std::thread
Cocos2dx引擎的核心仍然是一个单线程的死循环(UI线程),在处理一些比较耗时的工作,如网络通信,纹理资源,音视频资源等,为防止界面出现卡顿,最好还是另开线程(Worker线程)。而在3.2的版本中并未发现pthread的支持,原来是C++11的标准库中已经有了std::thread。下面给出一个简单示例:
boolHelloWorld::init()
- if(!Layer::init())
- false;
- }
- std::threadt1(&HelloWorld::myThread,this);
- t1.join();
- //t1.detach();
- log("inmajorthread");
- true;
- voidHelloWorld::myThread()
- {
- log("inmythread");
-
C++11中还有很多其他的新特性,如右值引用与move语义,std::move,无序容器(unordered_map...),初始化列表等;想更深入的了解请查看c++11FAQ
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|