心血来潮,一直闷头看书,但是从来不写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的之类情况,就是引用的局部变量,已经被释放了,你的回调函数才开始执行