移动构造函数应用的场景????

答:有时候我们会遇到这样一种情况,我们用对象a初始化对象b,后对象a我们就不在使用了,但是对象a的空间还在呀(在析构之前),既然拷贝构造函数,实际上就是把a对象的内容复制一份到b中,那么为什么我们不能直接使用a的空间呢?这样就避免了新的空间的分配,大大降低了构造的成本。这就是移动构造函数设计的初衷。

例子示下:

#include<string>
#include<vector>
using namespace std;class String;
ostream& operator<<(ostream& out, String& s);
class String
{
public:friend ostream& operator<<(ostream& out, String& s);
public:String(const char* data = ""){if (data == NULL){m_data = new char[1];m_data[0] = '\0';}else{m_data = new char[strlen(data) + 1];strcpy(m_data, data);}cout << "constructor execute..." << endl;}String(String &&s)noexcept{cout << "move constructor execute..." << endl;m_data = NULL;this->m_data = s.m_data;s.m_data = NULL;}~String(){cout << this<<"free execute..." << endl;if(m_data != NULL)delete[] m_data;}
private:char* m_data;
};ostream& operator<<(ostream& out, String& s)
{out << s.m_data;return out;
}
int main()
{String s = "hello";vector<String> vs(1);vs.push_back(std::move(s));return 0;
}

执行结果:

解析运行结果:

1、第一个 “默认构造函数” 是因为vector<String> vs(1) , 所以事先使用默认构造函数构造了一个Test对象

2、第二个 “默认构造函数” 是因为Test t ,使用默认构造函数构造了一个对象

3、第三个 “移动构造函数” 大多数人会以为是 vec.push_back(std::move(s)) ,push_back 导致对象的移动而输出的。具体的原因其实是由于重新分配内存而导致的,我们的 vector 对象 vs 初始的容量只有 1 ,且里面已经有一个对象了,就是vector<Test> vs(1)的时候创建的,所以再向vs里面添加String对象时,就会导致vs重新分配内存。由于vs中的对象定义了移动构造函数且是可用的(因为我们将其声明为了noexcept),所以就会调用移动构造函数将vs中原始的那个对象移动到新的内存中,从而输出 “移动构造函数”。

4、第四个 “移动构造函数” 才是因为String对象 t 被移动到vector 对象 vs 新的空间而输出的

5、第五个 “析构函数” 是因为重新分配内存后,原来的内存将被销毁,所以输出一个“析构函数”

6、后面三个 “析构函数” 是因为执行了return 0, 内存被释放,vs 和 s 都被析构,所以输出三个 “析构函数

注意:

第四行的输出由 “移动构造函数” 变成了 “拷贝构造函数” ,原因是:

由于我们的移动构造函数没有声明为noexcept,所以我们的移动构造函数就会被认为是可能抛出异常,所以在重新分配内存的过程中,vs对象就会使用拷贝构造函数来“移动”对象(这里说的移动其实是拷贝,并不是移动),所以就输出了“拷贝构造函数”。

转载于:https://www.cnblogs.com/single-dont/p/11328524.html

剖析——移动构造函数相关推荐

  1. 剖析Caffe源码之Net---Net构造函数

    目录 Net构造函数 读取Prototxt ReadProtoFromTextFile UpgradeNetAsNeeded 设置网络状态 Init函数 FilterNet InsertSplits ...

  2. java 构造函数内部的多态方法 完全剖析

    我们先来看一个例子,如果你读过<java编程思想>的话 应该会有印象 1 package com.test.zj; 2 3 public class PolyConstructors { ...

  3. 【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数

    加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 问题一:构造函数与析构函数可以成为虚函数么? 答案: 1.构造函数不可以成为虚函数 因为在构造函数执行结束后,虚函 ...

  4. 剖析javascript中构造函数

    在绝大多数的编程语言中,均存在函数这一概念,其含义大概可以归纳为:包含一定语句,用于完成某些有意义的工作,如处理文本.控制输入输出或计算数值等.通过在程序代码中引入函数名称和所需的参数,可在该程序中执 ...

  5. WorldWind源码剖析系列:BMNG类构造函数深入分析

    BMNG构造函数深入分析 一.主要类图 二.主要功能: 1)        BMNG类 BMNG类将包含以"Blue Marble"为主题的所有可渲染影像的根节点添加到当前星球的可 ...

  6. js1:对象的学习,构造函数,继承构造函数【使用教材:JavaScript深度剖析第2版】...

    原文发布时间为:2008-11-08 -- 来源于本人的百度文章 [由搬家工具导入] <html> <head> <title>js</title> & ...

  7. SharePoint2010 内容类型剖析

    SharePoint 2010 在上一版本的基础上进一步发展了内容类型对象.本系列作为一个专题,试图对其进行一个深入的剖析.方便大家在自己的自定义解决方案中对其进行定制. 内容类型的定义 ShareP ...

  8. WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇)

    [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]在.NET中,所有的集合都实现了IEnumerable接口,比如Arra ...

  9. 剖析IntentService的运作机理

    2019独角兽企业重金招聘Python工程师标准>>> 剖析IntentService的运作机理 (本文以Android 5.1为准) 侯 亮 1 概述 在讲述Service机制的文 ...

最新文章

  1. 影子系统、沙箱、虚拟机之间的区别
  2. OpenGL 使用FDTD求解电磁波方程
  3. CodeForces - 1305D Kuroni and the Celebration(思维,互动题)
  4. poj1201/zoj1508/hdu1384 Intervals(差分约束)
  5. centos安装docker显示 No package docker-ce available
  6. python网络编程项目_python网络编程详解
  7. 软件开发生命周期中的设计阶段_什么是软件生命周期模型?软件测试和软件开发的关系分析!...
  8. 汽车电子电气架构工程师的工作
  9. Postman 是一个接口测试和 http 请求的神器,非常好用。
  10. .com与.top域名有什么区别
  11. Programming TCP/IP Windows Sockets in C++
  12. Android Studio第六课:模仿QQ登录跳转
  13. 图像形态学——击中击不中
  14. Unity3D性能优化——工具篇
  15. 在eclips中配置maven
  16. redis的基本操作And数据持久化方式以及redis实现mybatis缓存
  17. 安装Google三件套
  18. Reinforcement Learning | 强化学习十种应用场景及新手学习入门教程
  19. 1.1亿!罗永浩首场直播爆卖背后:放下面子赚钱,才是成年人最大的体面
  20. xbel文档_什么是.recently-used.xbel?如何永久删除它?

热门文章

  1. asp dsn mysql 连接失败_ASP连接MySQL遇到一些问题 Microsoft OLE DB Provider for ODBC Drivers (0x80004005)...
  2. linux执行指定程序的命令,linux 下使用指定的用户来执行命令
  3. android 系统亮度,android 设置系统屏幕亮度
  4. toncat 如何部署 java_tomcat中部署java项目
  5. c语言判断一个点在长方体内部_21个入门练手项目,让你轻松玩转C语言
  6. java面试题八 传值传引用
  7. Web前端之移动端课程开发之06.bootstrap
  8. 印度程序培训之ISAS考试方法及评分参考准则
  9. Nginx开发一个简单的HTTP过滤模块
  10. 学习“Perl基础教程:正则表达式”之摘录