【C++进阶】C++11(下)新的类功能、 可变参数模板和 lambda表达式

文章介绍了C++11标准引入的新特性,包括默认成员函数如移动构造函数和移动赋值运算符,以及如何通过default和delete关键字控制默认函数的行为。此外,还讨论了可变参数模板的使用,如递归展开参数包,以及在emplace操作中的应用。最后,文章提到了lambda表达式的便利性,它简化了自定义比较函数的过程。
摘要由CSDN通过智能技术生成

新的类功能

默认成员函数

原C++类中有有个默认成员函数

  1. 构造函数
  2. 析构函数
  3. 拷贝构造函数
  4. 拷贝赋值重载
  5. 取地址重载
  6. const 取地址重载

最重要的是前4个,后两个用处不大。默认成员函数就是我们不写编译器会生成一个默认的。
C++11 新增了两个移动构造函数和移动赋值运算符重载

针对移动构造函数和移动赋值运算符重载有一些需要注意的点如下:

  • 如果没有自己实现移动构造函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任意一个。那么编译器会自动生成一个默认移动构造。默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝自定义类型成员则需要看这个成员是否实现移动构造,如果实现了就调用移动构造,没有实现就调用拷贝构造
  • 如果没有自己实现移动赋值重载函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任意一个,那么编译器会自动生成一个默认移动赋值。默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝自定义类型成员则需要看这个成员是否实现移动赋值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。(默认移动赋值跟上面移动构造完全类似)
  • 如果提供了移动构造或者移动赋值,编译器不会自动提供拷贝构造和拷贝赋值。

示例:
在这里插入图片描述
如果实现了拷贝构造、拷贝赋值和析构没有实现移动构造和移动赋值那么会自动生成移动赋值或者移动构造吗
场景一:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
如果没有实现了拷贝构造、拷贝赋值和析构并且没有实现移动构造和移动赋值那么会自动生成移动赋值或者移动构造吗?
场景二:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

类成员变量的初始化

C++11允许在类定义时给成员变量初始缺省值,默认生成构造函数会使用这些缺省值初始化,这个我们在类和对象默认就讲了,这里就不再细讲了。

default

C++11可以让你更好的控制要使用的默认函数。假设你要使用某个默认的函数,但是因为一些原因这个函数没有默认生成。比如:我们提供了拷贝构造,就不会生成移动构造了,那么我们可以使用default关键字显示指定移动构造生成。
示例:
在这里插入图片描述
在这里插入图片描述

delete

如果能想要限制某些默认函数的生成,在C++98中,是该函数设置成private,并且只声明补丁已,这样只要其他人想要调用就会报错。在C++11中更简单,只需在该函数声明加上=delete即可,该语法指示编译器不生成对应函数的默认版本,称=delete修饰的函数为删除函数。
在这里插入图片描述
在这里插入图片描述

可变参数模板

C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以这块还是比较晦涩的。现阶段呢,我们掌握一些基础的可变参数模板特性就够我们用了,所以这里我们点到为止,以后大家如果有需要,再可以深入学习。
在这里插入图片描述

递归函数方式展开参数包

在这里插入图片描述
在这里插入图片描述

逗号表达式展开参数包

在这里插入图片描述
在这里插入图片描述

使用场景

一般使用在emplace这个插入接口中。
在这里插入图片描述
那么emplace和普通的push_back有什么区别吗?
在这里插入图片描述
在这里插入图片描述
可以看到emplace的效率比较高一点点。

lambda表达式

在讲lambda表达式之前先看一个场景。
在这里插入图片描述
当我们对自定义类型排序时,我们要自己实现和传仿函数。
随着C++语法的发展,人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法,都要重新去写一个类如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。因此,在C++11语法中出现了Lambda表达式

用法

在这里插入图片描述

语法

lambda表达式书写格式[capture-list] (parameters) mutable -> return-type { statement }
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

捕获列表

在这里插入图片描述
在这里插入图片描述
场景一:
在这里插入图片描述

场景二:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值