C++11新特性解析与应用 nullptr,=default ,=delete,lambda部分

心血来潮,一直闷头看书,但是从来不写BLOG,随意谢谢

第七章:为改变思考方式而改变

1 。nullptr

指针空值   

类型 nullptr_t  

应用: func(char *)   func(int)

func(NULL)  func((void *)0)   func(nullptr)

调用2 , 1, 1

nullptr_t 可以隐式转化任意指针类型,不能转换非指针类型

nullptr_t 不适用算数运算表达式,可用于关系表达式>= <= =s=  != 只能比较于 nullptr_t 或者指针类型

template<typename T>

void func1(T *)  vod func2(T)

func1(nullptr)  //出错 类型为nullptr_t,不是指针

func1((float *)nullptr)  //推导出 float

func2((float *)nullptr)    //推导出float *

sizeof(nullptr)==sizeof(void *)

2. =default ,=delete  函数尾部

控制默认函数版本是否生成,

6个构造函数

默认构造

拷贝构造

赋值构造(operator =)

移动拷贝构造

移动构造

析构

operator

,

&

&&

*

->

->*

new

delete

=default ,生成缺省版本

=delete ,不生成缺省版本

对POD类型影响 ,=default 后不要再单独实现另外一个,可保持POD类型

class T

{

T(int)

T(char)=delete

}

3。 重点 lambda

[capture](parameters)mutable->return -type{statement}

capture: 捕捉列表 &,=,this  ,注意这个捕捉列表是当前lambda上下文内的,捕捉指针 用=更好,如果是一个回调函数,局部变量已经释放了,&就会出错,但是=不会,=是一个初始状态,而&会具值动态变化

parameters:参数列表,跟普通函数一样,可以连同()一起省略

mutable:取消lambda返回值const  属性,默认lambda总是一个const 函数

return -type:返回类型,可以省略,编译器会自动推导

statement :函数体,可以使用参数,也可使用捕捉的变量

lambda与仿函数:

非常类似

class func

{

public:

int operator()(int a,int b)

{

return a+b;

}

}

auto func1=[](int a,int b){ return a+b;};

func a;

a(1,2);

func1(2,3)

调用看上去差不多

但是前者本质不是一个函数


升级

class func

{

private:

int _a;

float _b;

public:

func(int a,float b):_a(a),_b(b){}

float operator ()(int c){ return c*_a+_b;};

}

int a=5;

float b=6.5;

func f1(5,6.5)

auto f2=[a,b](int c){return a*c+b};

f1(3)

f2(3)

看上去也很像

仿函数 是编译器实现lambda的一种方式,而lambda是仿函数的“语法甜点”


lambda使用:用cocos2dx 里,不被重复使用的 回调函数CallFunc  和 schedule   都可以用lambda

lambda可以代替一些逻辑代码,当作局部函数使用,相比于 static inline  可读性好,但是并没有提升性能

注意  [&] [=] 的区别,这里很容易出错,,&变量是根据lambda函数调用时,&变量的状态,=变量是在定义lambda函数时候,就确定了,这个体现在cocos2dx 中的回调函数体现更为明显,很多lambda引用不当,就会出现 访问0x000005的之类情况,就是引用的局部变量,已经被释放了,你的回调函数才开始执行



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值