C++11 学习札记(一)
来源:互联网 发布:伊塞亚·托马斯数据 编辑:程序博客网 时间:2024/06/11 06:11
最近在看cocos3.2的源码,碰到一些不是很熟悉的c++11新语法代码, C++11 之前有个系统的学习,但是又似乎有些
忘却了, 所以还是做些学习笔记,以备日后学习参考:
item1,新增显式关键字 override和final (似乎闻到C++在妥协的味道)
final用来显示约束继承,如 struct C final {xxx} ;class C final {xxx};那么C包不能再被作为其他类的父类进行继承。
这对于类中的函数也成立的:
struct C{ virtual void f() final {} // final 函数}; struct C1 : C{ virtual void f() {}};对于这种重写操作,同样具有约束作用。
override参数也是类似的,这两个关键字可以让编译器帮我们预先发现错误,如下:
struct B3{ virtual void f() {}}; struct D3 : B3{ void f() {}};对于上面的覆盖操作,如果借助override关键字可以更加清晰的防止一些低级错误的发生。
struct B4{ virtual void g(int) {}}; struct D4 : B4{ virtual void g(int) override {} // OK virtual void g(double) override {} // Error};这些并不是一些简单的语法糖,一来编译器确确实实为我们做了很多的检查,二来编译器也做了些优化,如上面的C::f(), 编译器能识别出这个函数不能被
覆盖,因此会将其从类的虚表中删除,而对于final类,编译器根本就不会为其生成虚表。
item2,lambda函数与表达式
[](int x, int y) {return x+y;}, 定义了一个匿名块,这个临时函数返回类型为decltype(x+y), 具体可参看wiki
http://zh.wikipedia.org/wiki/C%2B%2B11#Lambda.E5.87.BD.E5.BC.8F.E8.88.87.E8.A1.A8.E7.A4.BA.E5.BC.8F
item3,std::function 和 std::bind
function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时。
std::function可以绑定到全局函数/类静态成员函数(类静态成员函数与全局函数没有区别),如果要绑定到类的非静态成员函数,则需要使用std::bind。
#include <iostream>#include <functional>using namespace std;typedef std::function<void ()> fp;void g_fun(){cout<<"g_fun()"<<endl;}class A{public:static void A_fun_static(){cout<<"A_fun_static()"<<endl;}void A_fun(){cout<<"A_fun()"<<endl;}void A_fun_int(int i){cout<<"A_fun_int() "<<i<<endl;}//非静态类成员,因为含有this指针,所以需要使用bindvoid init(){fp fp1=std::bind(&A::A_fun,this);fp1();}void init2(){typedef std::function<void (int)> fpi;//对于参数要使用占位符 std::placeholders::_1fpi f=std::bind(&A::A_fun_int,this,std::placeholders::_1);f(5);}};int main(){//绑定到全局函数fp f2=fp(&g_fun);f2();//绑定到类静态成员函数fp f1=fp(&A::A_fun_static);f1();A().init();A().init2();return 0;}
#include <iostream>#include <functional>using namespace std;typedef std::function<void ()> fp;class A{public:virtual void f(){cout<<"A::f()"<<endl;}void init(){//std::bind可以表现出多态行为fp f=std::bind(&A::f,this);f();}};class B:public A{public:virtual void f(){cout<<"B::f()"<<endl;}};int main(){A* pa=new B;pa->init();return 0;}
参考文章:
http://blog.csdn.net/qq575787460/article/details/8531397
- C++11 学习札记(一)
- JAVA学习札记(一)
- c++学习札记(一)
- CLR 学习札记(一)
- 树莓派学习札记(一)
- Python3 学习札记(一)
- Ajax学习札记(一)AutoCompleteExtender控件
- C++ Primer 学习札记(一)
- 《LINUX设备驱动程序》学习札记(一)
- 【Java SE学习札记】 (一)
- 学习札记一(杂)
- react学习札记(一)
- C++学习札记一
- 2007excel学习札记一
- 深圳札记(一)
- 无题札记(一)
- ruby札记(一)
- 工作札记(一)
- xcode6模拟器路径
- hdu 5185 Equation (完全背包变形)
- 实验: ASSM内部存储研究大揭密
- hadoop运维汇总篇
- 方便好使的java.util.Properties类
- C++11 学习札记(一)
- TextView加载html标签,实现textview字体颜色随机变化
- (4.1.7)Editext自动获取焦点
- python安装
- 4sum
- 解决android启动app时出现短暂的黑屏或一个带title的界面
- Oracle基本数据类型存储格式浅析(二)——数字类型
- 调查显示:上千人都在“这时”投简历!
- (4.1.8) Android Fragment 真正的完全解析(上)