目录
Big-Three 到 Big-five以及他们的delete和default
这里先录入部分新特性,以后学到再把剩余的添上。主要以候捷前辈ppt的展出形式学习,如果触犯了相关“法律”,告知我,删立决。
Big-Three 到 Big-five以及他们的delete和default
三大“巨头”函数分别为拷贝构造函数、拷贝赋值函数和析构函数,然后11-14增加到5个“巨头”函数,增加的另外2个是:构造函数、普通函数。
我想上面的图已经很清楚地描述了Big-five的default和delete使用情况。
Type Alias
Typedef 可以使用using关键字替换。
图中的注释:使用Type Alias的定义和使用typedef的定义没有什么不同,并且Type Alias这种定义可以出现在{}域、类域、命名空间域中。
所以using不仅可以用于替代Typedef,还能像下图中那样使用。
图中展示了using的3类用途:1.某个文件中的使用到了某个命名空间的好多成员,或者一个成员,可以用using声明一下。2.某个类中使用到了某个命名空间的成员。3.用于Type Alias类型别名和别名模板。
类型推导(decltype)
图释:推到一个表达式的类型,和typeof一个用途,而typeof不是c++的标准实现,所以c++2.0把decltype纳入了标准。它目前有3个用处,1.函数返回类型的声明,2.用于元编程,3.推导lambda表达式的类型。
用途1举例:
用途2举例:
图释:写这个模板的作者知道这个模板只能用于参数是容器类型的函数,所以传入非容器类型的参数会编译失败,因为decltype(obj)这个类型没有iterator这个inner type。
用途3举例:
Lambda
先看一个中文的板书和例子。
是匿名函数,即没有函数名的函数。完整形式: [捕获外部变量列表 ] (参数列表) mutable exception->返回类型 { 函数体 },mutable:在外部变量列表以值来捕获时,无法修改变量的值,加上mutable表示可修改(不会影响外部变量) 。
auto i = 5;
// [&] 表示外部变量都以引用的形式在lambda中使用,函数内部修改i的值会影响外部
// 这里的 -> auto 自动推导在c++11不支持,c++14中对auto进行了扩展
thread t1([&] () -> auto {
i = 100;
cout << "线程:" << i << endl;
});
_sleep(10);
cout << i << endl;
捕获形式 | 说明 |
---|---|
[] | 不捕获任何外部变量 |
[i, …] | 以值得形式捕获指定的多个外部变量(用逗号分隔);如果引用捕获,需要显示声明& |
[this] | 以值的形式捕获this指针 |
[=] | 以值的形式捕获所有外部变量 |
[&] | 以引用形式捕获所有外部变量 |
[=, &x] | 变量x以引用形式捕获,其余变量以传值形式捕获 |
[&, x] | 变量x以值的形式捕获,其余变量以引用形式捕获 |
开始候先生的板书:
图释:[]中可捕获的参数可以是pass by value or pass by refenrence;只要mutable、throwspec、->、retType有一个出现,则小括号(…)一定要出现;
举例如下图:
图释:Lambda其实等同于一个类,id是值传递。
继续观察下图中的例子:
编译器对lambda的处理如下图:
图释:虽然编译器可能如此处理lambda,但是lambda没有默认的构造函数()和赋值操作=。
你的打赏是我奋笔疾书的动力!
支付宝打赏:
微信打赏: