C++11:移动构造函数【写法+调用时机】【C++返回vector为什么不报错】

文章目录

      • what is 移动构造函数?
      • 移动构造函数的实现的例子
      • when 移动构造函数?
      • 在C++98之前,没有移动构造函数,是怎么做的呢?
      • 后记

what is 移动构造函数?

构造函数string(string&& str)类似于复制构造函数,导致新创建的 string为 str 的副本。但与复制构造函数不同的是,它不保证将 str视为const,可修改源对象,还可能转让所有权而不做任何复制(对比来看,复制构造函数完整的保留源对象)。这种构造函数被称为移动构造函数(move constructor)。如果源对象是临时的,移动操作的效率将高于常规复制。

(总结自《C++ primer plus》)

移动构造函数的实现的例子

在这里插入图片描述

解释一下成员变量

ct是静态成员,统计出对象数量。pc是point to data,值是new出来的一个数组的指针。n是数组元素的个数。

然后解释这个移动构造函数:

  1. n(f.n)是参数表,意思等同于this.n = f.n

  2. 大括号之内的第一行,ct自增。因为稍后对原件进行析构时,ct还会自减。为了达到“仅移交对pc指向的数组的控制权,而其余量不变”的效果,故先自增。

  3. 第二行,this.pc = f.pc移交控制权。
    如果,到此为止结束,那么就是编译器默认造出来的复制构造函数干的活儿。此时,pe 和fpe 指向相同的数据,调用析构函
    数时这将带来麻烦,因为程序不能对同一个地址调用delete[]两次。

  4. 第三行,把原来的变量的成员都窃取之后,原pc被置为空指针,因为稍后对原件进行析构,delete[]一个空指针nullptr,是没有问题的。

  5. 第四行可以不写。

when 移动构造函数?

要让移动语义发生,需要两个步骤。①右值引用让编译器知道何时可使用移动语义,②编写移动构造函数,使其提供所需的行为。

Complex c(a + b);

上例,这里函数a+b的返回值就是右值。(为何常规函数返回值是右值呢?这是因为这种返回值位于临时内存单元中,运行到下一条语句时,它们可能不再存在。)

vector<int> fun(void)
{vector<int> nums;// ……在此,nums中存入一些数据……return nums;
}

对于上例,待返回值也是右值吗?以下是一个测试:
在这里插入图片描述

在C++98之前,没有移动构造函数,是怎么做的呢?

如果没有移动构造函数,那就用的是复制构造函数:
在这里插入图片描述

后记

研究这个问题的起因是,不理解为什么在一个函数内部声明的vector容器可作为返回值而不出错?潜意识里,vector作为局部变量,被调函数返回后vector会被析构的,那再在主调函数中访问vector中的元素,怎么就能访问呢?

// 就是这个例子
vector<int> fun(void)
{vector<int> nums;// ……在此,nums中存入一些数据……return nums;
}

通过研究,我的结论是,无论是新特性的移动构造函数,还是原来的复制构造函数,stl的vector内部实现都是深拷贝。stl内部可能的实现方式,可能是移交控制权+析构空指针,也可能是逐个元素去复制+析构局部变量的那个vector。总之,由于其良好的内部实现,不会发生错误。换言之,局部申请的vector可以直接作为返回值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2779763.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

多旋翼无人机飞行控制详解,四旋翼无人机飞控原理深入解析

在四旋翼无人机中&#xff0c;相邻的两个螺旋桨旋转方向是相反的。如图所示&#xff0c;三角形红箭头表示飞机的机头朝向&#xff0c;螺旋桨M1、M3的旋转方向为逆时针&#xff0c;螺旋桨M2、M4的旋转方向为顺时针。当飞行时&#xff0c;M2、M4所产生的逆时针反作用力&#xff0…

黄金交易策略(Nerve Nnife.mql4):大K线对技术指标的影响

我们使用heiken ashi smoothed来做敏感指标&#xff08;大趋势借助其转向趋势预判&#xff0c;但不是马上转变&#xff09;&#xff0c;has默认使用6根k线的移动平均值来做计算的。若在6根k线规范内有一个突变的行情&#xff08;k线很长&#xff09;&#xff0c;那么整个行情的…

物联网和工业4.0

在当今这个快速发展的技术时代&#xff0c;物联网&#xff08;IoT&#xff09;和工业4.0成为了推动全球进入新工业时代的两大驱动力。对于刚入行的人来说&#xff0c;深入理解这两个概念及其背后的技术原理&#xff0c;对于把握未来的职业机会至关重要。 物联网&#xff0c;简…

【EAI 016】VIMA: General Robot Manipulation with Multimodal Prompts

论文标题&#xff1a;VIMA: General Robot Manipulation with Multimodal Prompts 论文作者&#xff1a;Yunfan Jiang, Agrim Gupta, Zichen Zhang, Guanzhi Wang, Yongqiang Dou, Yanjun Chen, Li Fei-Fei, Anima Anandkumar, Yuke Zhu, Linxi Fan 作者单位&#xff1a;Stanfo…

Netty应用(七) 之 Handler Netty服务端编程总结

目录 15.Handler 15.1 handler的分类 15.1.1 按照方向划分 15.1.2 handler的结构 15.2 输入方向ChannelInboundHandlerAdapter 15.2.1 输出方向Handler的顺序 15.2.2 多个输入方向Handler之间的数据传递 15.2.2.1 handler消失了 15.2.2.2 手动编写netty提供的new Strin…

opencv mat用法赋值克隆的操作和一些基本属性

//Mat基本结构 (头部 数据部分) //赋值的话 就是修改了指针位置 但还是指向了原来数据 并没创建数据 本质上并没有变 //只有克隆或者拷贝时 它才会真正复制一份数据 //代码实现 //创建方法 - 克隆 //Mat m1 src.clone(); //复制 //Mat m2; //src.copyTo(m2); //赋值法 …

【Linux】学习-基础IO—上

Linux基础IO—上 复习c语言接口 你真的懂文件吗&#xff1f; 文件的打开与关闭 深入了解文件读与写(C语言级别) 系统文件I/O 我们知道&#xff0c;文件是放在磁盘(硬件)上的&#xff0c;我们用代码访问文件的思路是&#xff1a; 写代码 -> 编译 -> 生成可执行exe …

shell脚本编译与解析

文章目录 shell环境变量全局变量局部变量设置PATH 环境变量 启动文件环境变量持久化 脚本编写重定向判断 和循环命令行参数传入参数循环读取命令行参数获取用户输入 处理选项处理简单选项处理带值选项 重定向显示并且同时输出到文件 替换目录下的所有文件中某个关键字删除关键字…

服务器内存使用率多少会影响正常访问?

在探讨服务器内存使用率多少会影响正常访问这个问题时&#xff0c;我们首先要明白&#xff0c;服务器的性能和稳定性与内存使用状况息息相关。当服务器的内存使用率过高时&#xff0c;可能会导致系统运行缓慢、程序崩溃或者出现其他一些异常情况&#xff0c;从而影响到正常的网…

c语言求多边形面积

多边形有现成的面积公式&#xff0c;直接套用即可。area函数接受两个参数&#xff1a;顶点坐标&#xff0c;顶点个数。 #include <stdio.h> #include <math.h>struct point {int x;int y; };float area(point p[], int n) {int i;float sum 0.0;for (i 0; i <…

使用CICFlowMeter 实现对pcap文件的特征提取【教程】

使用CICFlowMeter 实现对pcap文件的特征提取【教程】 针对现有的关于CICFlowMeter 的使用教程不够全面&#xff0c;一些细节没有展示&#xff0c;我将结合网络上的相关资料和实际的经历&#xff0c;提供一些经验和建议。 configuration information --------------- Windows…

机器学习:Softmax介绍及代码实现

Softmax原理 Softmax函数用于将分类结果归一化&#xff0c;形成一个概率分布。作用类似于二分类中的Sigmoid函数。 对于一个k维向量z&#xff0c;我们想把这个结果转换为一个k个类别的概率分布p(z)。softmax可以用于实现上述结果&#xff0c;具体计算公式为&#xff1a; 对于…

嵌入式学习之Linux入门篇笔记——11,Linux目录结构讲解

配套视频学习链接&#xff1a;http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 1.Linux 目录结构 Linux 整个文件系统是从 / 目录&#xff08;根…

架构(十三)动态本地锁

一、引言 加锁大家都知道&#xff0c;但是目前提供动态锁的基本都是分布式锁&#xff0c;根据订单或者某个收费款项进行加锁。比如这个1订单要收刷卡费用&#xff0c;那就OREDER_1做为key丢到redis进行分布式加锁。这也是当下分布式锁最流行的方式。 但是对于平台项目或者一些并…

C++ | string类按位赋值小技巧

一切的起因是string类的谜之初始化。 在写代码的时候&#xff0c;我发现即使没有用字符串初始化string对象&#xff0c;也可以对string对象进行下标操作&#xff0c;就像这样&#xff1a; #include<iostream> #include<string> using namespace std; int main() {…

读书笔记之《运动改造大脑》:运动是最佳的健脑丸

《运动改造大脑》的作者是约翰•瑞迪&#xff08;John Ratey&#xff09; / 埃里克•哈格曼&#xff08;Eric Hagerman&#xff09;&#xff0c;原著名称为&#xff1a;Spark&#xff1a;the revolutionary new science of exercise and the brain&#xff0c;于 2013年出版约翰…

Activiti7(流程引擎)简单笔记,附带作者执行的Demo代码文件

文章目录 一、Activiti7流程基础1、最简单的流程2、流程值表达式3、方法表达式4、节点监听器5、流程变量6、候选人7、候选人组8、流程网关排他网关并行网关包容网关事件网关 二、Activiti7流程事件1、定时器事件定时器开始事件定时器中间事件定时器边界事件 2、消息事件消息开始…

【EAI 015】CLIPort: What and Where Pathways for Robotic Manipulation

论文标题&#xff1a;CLIPort: What and Where Pathways for Robotic Manipulation 论文作者&#xff1a;Mohit Shridhar1, Lucas Manuelli, Dieter Fox1 作者单位&#xff1a;University of Washington, NVIDIA 论文原文&#xff1a;https://arxiv.org/abs/2109.12098 论文出处…

问题:重热现象可使多级汽轮机的理想焓降增加,重热系数越大,多级汽轮机的内效率就越低。 #学习方法#微信#媒体

问题&#xff1a;重热现象可使多级汽轮机的理想焓降增加&#xff0c;重热系数越大&#xff0c;多级汽轮机的内效率就越低。 参考答案如图所示

FL Studio如何改变轨道颜色 FL Studio波形颜色如何自定义 flstudio21中文版下载 FL Studio 设置颜色

FL Studio如何改变轨道颜色&#xff1f;FL Studio的轨道颜色可以在播放列表或混音台界面进行修改。FL Studio波形颜色如何自定义&#xff1f;FL Studio的波形文件颜色、名称、图标等信息都是可以自定义的&#xff0c;下文将给大家详细讲述。 一、FL Studio如何改变轨道颜色 在…