IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++11新特性】| 【05】nullptr、deleted、lambda解析 -> 正文阅读

[C++知识库]【C++11新特性】| 【05】nullptr、deleted、lambda解析

1、nullptr

使用指针时,务必需要将其初始化,否则将会是一个悬挂指针;

【NULL】:传统的C中NULL被定义为字面量0或者定义为无类型指针(void*);
【nullptr】:C++11中,nullptr是一个指针空值类型的常量,指针空类型为nullptr_t,而不是指针;
	==> typedef decltype(nullptr) nullptr_t;
	- 当在模板推导时,不会被推导为指针类型;
	- 不是一个(void*)0的别名;
	- 是一个编译期常量;
	- 能够隐式转化到其他指针类型;
	- 其地址不能被用户获取(为右值常量);
【nullptr_t】:声明一个指针空值类型的变量;
	- 使用该类型定义的数据都是等价的;
	- 该类型可以隐式转换为任意指针,但不能转换为非指针类型;
	- 不适合算术运算表达式,但满足关系表达式;
	- 其地址能够被用户使用;

2、默认函数的控制

类的默认函数:
	成员函数 == > 构造、拷贝构造、拷贝赋值、移动构造、移动拷贝、析构;
	操作符函数  == > , & && * -* ->* new delete

【default】:C++11提供该关键字显示指定为默认版本;
【deleted】:C++11提供该关键字显示指定为删除该函数;  

- 此类函数能够用于类外的成员函数上;
- 也可以使用类上;
- deleted可以删除一些转换函数,防止隐式转换;如:operator(char c) = deleted;
- 也可以使用在普通函数上;

3、lambda函数

lambda:该函数是基于初始状态进行运算(闭包的类);
表达式为:[]()mutable -> return-type { ...}
- []:捕捉列表;
	- [var]:以值传递,若加上`&`则表示引用传递,使用当一个`=`或`&`表示父作用域的变量都可使用;
	- this:以值传递一个this指针;
	- 传入多个使用`,`分割;
	- 捕捉列表不允许变量重复传递,当可以通过不同方式传递相同变量;
	- 
- ():参数列表,若无参数,则可以省略;
- mutable:默认为const,使用该修饰符可以取消常量性,当使用该修饰符,则()不能省略;
- ->return-type:返回类型;
- {}:函数体;

3.1 lambda与仿函数

C++【STL】 | 仿函数的应用以及如何规范要求

可以使用lambda替代仿函数;
class AirportPrice {
private:
	float _dutyfreerate;
public:
	AirportPrice(float rate) : _dutyfreerate(rate) {}
	float operator(float price) {
		return price * (1-_dutyfreerate/100);
	}
};

void test() {
	float tax_rate = 5.5f;
	AirportPrice Changi(tax_rate);
	auto Changi2 = [tax_rate](float price)->float{return price * (1-tax-rate/100);};
	/**
	[tax_rate]相当于类构造;
	(float price)->float{return price * (1-tax-rate/100);}相当于float operator(float price)
	*/ 
	float purchased = Changi(3699);
	float purchased = Changi2(2899);
}

3.2 lambad的参数问题

【值传递】:传递的值在`函数定义`时的值;
【引用传递】:传递的值是`函数调用`时(运行时)的值;
void test() {
    int j = 12;
    auto by_val = [=] { return j+1; };
    auto by_ref = [&]{return j+1;};

    cout << "by_val " << by_val() << endl;
    cout << "by_ref " << by_ref() << endl;

    j++;
    cout << "by_val " << by_val() << endl;
    cout << "by_ref " << by_ref() << endl;
}
/**
		by_val 13
		by_ref 13
		by_val 13
		by_ref 14
*/
C++11允许lambda向函数指针的转换;
- 该函数不能捕捉任何变量;
- 该函数类型需要一致;
- 参数必须一致;

mutable和const

【值传递】:const下,不能修改常量,mutable下可以,但修改不了外部变量;
【引用传递】:const下能修改但该不了外部变量,mutable可以将该外部变量修改;
void test() {
    int j = 12;
    auto by_val = [=] { return j+1; };
    auto by_ref = [&]{ j = 10; return j;};

    cout << "by_val " << by_val() << endl;      // 13
    cout << j << endl;                          // 12
    cout << "by_ref " << by_ref() << endl;      // 10 引用被lambda修改
    cout << j << endl;                          // 10 引用被lambda修改

    auto by_val_1 = [=]()mutable {  j = 1; return j; };
    auto by_ref_1 = [&] ()mutable { j = 2; return j; };

    cout << "by_val " << by_val_1() << endl;    // 1 被lambda修改为1
    cout << j << endl;                          // 10 没有被lambda改变   
    cout << "by_ref " << by_ref_1() << endl;    // 2 被lambda修改为2
    cout << j << endl;                          // 2 被lambda改变
}

3.3 lambda与STL

可以将lambda应用于STL函数,提高代码的可读性,正确性,可维护性且其性能与内联函数不存在大的差别;
如:
find_if(begin(), end(), compose2(logical_and<bool>(),
						bind2nd(less<int>(), high),
						bind2nd(greater_equal<int>(), low)));
find_if(begin(), end(), [=](int i){
		return i >= low && i < high;
	});
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:26:01  更:2022-05-18 17:26:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:06:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码