当前位置: 首页 > news >正文

C++笔记-C++11(三)

会⽣成⼀个默认的。C++11 新增了两个默认成员函数,移动构造函数和移动赋值运算符重载。

如果你没有⾃⼰实现移动构造函数,且没有实现析构函数 、拷⻉构造、拷⻉赋值重载中的任意⼀

个。那么编译器会⾃动⽣成⼀个默认移动构造。默认⽣成的移动构造函数,对于内置类型成员会执

⾏逐成员按字节拷⻉,⾃定义类型成员,则需要看这个成员是否实现移动构造,如果实现了就调⽤

移动构造,没有实现就调⽤拷⻉构造。

上面看着有三个函数,但是我们之前也说过这三个函数一般都是同时出现的,出现析构函数,说明这个类中有资源需要释放,自然就要写拷贝构造和拷贝赋值,变相地降低了我们的记忆成本。

下面我们来看一个例子:

前面两个例子我就不多说了,主要看最后一个,此时在Person类中我们并没有实现 析构函数 、拷⻉构造、拷⻉赋值重载中的任何一个,此时就会生成默认的移动构造函数去调用string类中的移动构造函数。

结果也正如我们所言,确实调用了string的移动构造。

而如果写了三个函数中的一个,比如我上面写的拷贝构造函数,那么就不会生成默认的移动构造函数,而是会走Person类中的拷贝构造,进而去调用string中的拷贝构造,结果也证实了这句话,确实没有调用string中的移动构造,而是调用了拷贝构造。

移动赋值和移动构造一样,在没有三个函数时会去调用相应的移动赋值。

相应的有这三个函数中的任意一个,也就不会生成默认移动赋值,会去调用相应的拷贝赋值。

5.2成员变量声明时给缺省值

成员变量声明时给缺省值是给初始化列表⽤的,如果没有显⽰在初始化列表初始化,就会在初始化列表⽤这个缺省值初始化,这点我们在类和对象就已经讲过,这里就不过多赘述了。

5.3default和delete

C++11可以让你更好的控制要使⽤的默认函数。假设你要使⽤某个默认的函数,但是因为⼀些原因

这个函数没有默认⽣成。⽐如:我们提供了拷⻉构造,就不会⽣成移动构造了,那么我们可以使⽤

default关键字显⽰指定移动构造⽣成。

我们来看一个例子:

和上面一样,此时我们运行就如上图所示,只会调用拷贝构造函数,那么我们要想让其调用相应的移动构造呢?

我们上面讲的生成默认的移动构造是一个办法,那么还有什么办法呢?

如上图所示,我们可以利用default关键字来强制生成一个Person类的移动构造函数,这样也能调用string中的移动构造。

而default的作用也就体现出来了,就是强制生成一个函数,当然不局限于上面的移动构造,可以时构造函数等等。

而delete与它正好相反,不让编译器强制生成某个函数:

就比如输入输出流,我们可以看到,在ostream中是不允许生成拷贝构造函数的,因为如果能拷贝构造会出现很多复杂的问题。

6.lambda

6.1lambda表达式语法

lambda 表达式本质是⼀个匿名函数对象,跟普通函数不同的是他可以定义在函数内部。lambda 表达式语法使⽤层⽽⾔没有类型,所以我们⼀般是⽤auto或者模板参数定义的对象去接收 lambda 对象。

我们之前还学过的函数指针,仿函数也都是可调用对象,现在又多了一种lambda。

lambda表达式的格式: [capture-list] (parameters)-> return type {function boby }。

capture-list: 捕捉列表,该列表总是出现在 lambda 函数的开始位置,编译器根据[]来 判断接下来的代码是否为 lambda 函数,捕捉列表能够捕捉上下⽂中的变量供 lambda 函数使 ⽤,捕捉列表可以传值和传引⽤捕捉,具体细节7.2中我们再细讲。捕捉列表为空也不能省略。

parameters: 参数列表,与普通函数的参数列表功能类似,如果不需要参数传递,则可以连

同()⼀起省略。

-> return type: 返回值类型,⽤追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。⼀般返回值类型明确情况下,也可省略,由编译器对返回类型进⾏推导。{function boby }: 函数体,函数体内的实现跟普通函数完全类似,在该函数体内,除了可以使⽤其参数外,还可以使⽤所有捕获到的变量,函数体为空也不能省略。

http://www.jsqmd.com/news/739921/

相关文章:

  • 我用 ChatGPT 新功能“走进”了三个房间,出来后沉默了五分钟
  • 从社交网络到推荐系统:『握手定理』和『二分图』到底是怎么在背后起作用的?
  • 掌握AI教材编写技巧,借助低查重AI写教材工具,轻松完成教学用书!
  • Rockchip Android设备开机动画“第二屏”定制指南:从uboot到kernel的logo替换全流程
  • 别再memcpy了!手写C++ Vector时,二维数组拷贝为何总出错?深度解析深浅拷贝陷阱
  • taotoken为独立开发者提供稳定可靠的大模型api服务
  • Keil5 C51开发避坑指南:从新建工程到STC-ISP下载,解决LED闪烁不明显的常见问题
  • 仅剩最后47份!《Python工业故障预测高保真仿真框架v2.3》——含数字孪生接口、OPC UA直连模块与FMEA联动引擎
  • 别再乱找了!人脸识别入门,这5个经典数据集(CASIA WebFace、CelebA等)的保姆级下载与使用避坑指南
  • AntiMicroX:免费开源的手柄映射工具,让所有PC游戏都支持游戏控制器
  • 终极风扇控制指南:用FanControl免费解决Windows电脑风扇噪音问题
  • 告别Keil,用RT-Thread Studio + CubeMX搞定STM32F4项目(附完整配置流程)
  • 告别Winform默认丑界面:用MaterialSkin快速打造现代化桌面应用(附完整配色方案)
  • 扩散模型在工业缺陷检测中的应用与优化
  • Fedora系统使用DNF包管理器切换源
  • C语言量子随机数发生器(QRNG)驱动开发:如何绕过Linux熵池污染,在裸金属环境下直采光电散粒噪声(附PCIe DMA零拷贝采样源码)
  • tttLRM技术解析:测试时训练在3D重建中的应用
  • 高通Camera HAL3实战:手把手教你添加一个自定义的Raw数据合并PipeLine(SWMFMergeRawTwo2One)
  • 2025届最火的六大降重复率神器横评
  • CentOS7服务器运维:用yum源管理多版本Golang(稳定版与RC版)实战
  • 深入浅出AUTOSAR NVM:用生活化比喻理解数据块、冗余与同步机制
  • C# Winform开发避坑指南:DataGridView绑定DataTable时,为什么总多出一行空白以及如何优雅地解决?
  • 【FreeRTOS+STM32 C语言深度优化】:仅改11行关键代码,系统吞吐量翻倍、栈溢出归零的工业级方案
  • 别再只跑sqlmap了!DC-8靶场中Drupal 7的SQL注入点手工挖掘与利用技巧
  • Linux服务器系统的 /etc/resolv.conf指向错误,无法访问外部域名(有z.ai回答)
  • SAP项目财务必看:WBS结算规则配置表设计与批量维护实战(含避坑指南)
  • 面试官追问数据预处理?用这个真实案例讲透归一化和标准化的选择
  • 告别WSL!用MSYS2在Windows 10/11上5分钟搞定SSH服务器(保姆级教程)
  • YimMenu终极指南:如何打造GTA5最强防护与游戏增强体验
  • 从NASTRAN到PATRAN:一文搞懂有限元后处理中‘应力’的完整传递链(含坐标系转换全流程)