下面随笔给出c++移动构造。

  在现实中有很多这样的例子,我们将钱从一个账号转移到另一个账号,将手机SIM卡转移到另一台手机,将文件从一个位置剪切到另一个位置……移动构造可以减少不必要的复制,带来性能上的提升。

  • C++11标准中提供了一种新的构造方法——移动构造。

  • C++11之前,如果要将源对象的状态转移到目标对象只能通过复制。在某些情况下,我们没有必要复制对象——只需要移动它们。

  • C++11引入移动语义:

    • 源对象资源的控制权全部交给目标对象

  • 移动构造函数

问题与解决

  • 当临时对象在被复制后,就不再被利用了。我们完全可以把临时对象的资源直接移动,这样就避免了多余的复制操作。

移动构造

  • 什么时候该触发移动构造?

    • 有可被利用的临时对象

  • 移动构造函数:

    class_name ( class_name && )

 1 //例:函数返回含有指针成员的对象(版本1)
2
3 //使用深层复制构造函数
4
5 //返回时构造临时对象,动态分配将临时对象返回到主调函数,然后删除临时对象。
6
7 #include<iostream>
8
9 using namespace std;
10
11 class IntNum {
12
13 public:
14
15   IntNum(int x = 0) : xptr(new int(x)){ //构造函数
16
17     cout << "Calling constructor..." << endl;
18
19   }
20
21   IntNum(const IntNum & n) : xptr(new int(*n.xptr)){//复制构造函数
22
23     cout << "Calling copy constructor..." << endl;
24
25   };
26
27   ~IntNum(){ //析构函数
28
29     delete xptr;
30
31     cout << "Destructing..." << endl;
32   
33   }
34
35   int getInt() { return *xptr; }
36
37 private:
38
39   int *xptr;
40
41 };
42
43 //返回值为IntNum类对象
44
45   IntNum getNum() {
46
47     IntNum a;
48
49     return a;
50
51   }
52
53 int main() {
54
55   cout<<getNum().getInt()<<endl;
56
57   return 0;
58
59 }
60
61 //运行结果:
62
63 Calling constructor...
64
65 Calling copy constructor...
66
67 Destructing...
68
69 0
70
71 Destructing...
 1 //例:函数返回含有指针成员的对象(版本2)
2
3 //使用移动构造函数
4
5 //将要返回的局部对象转移到主调函数,省去了构造和删除临时对象的过程。
6
7 #include<iostream>
8
9 using namespace std;
10
11 class IntNum {
12
13 public:
14
15   IntNum(int x = 0) : xptr(new int(x)){ //构造函数
16
17     cout << "Calling constructor..." << endl;
18
19   }
20
21   IntNum(const IntNum & n) : xptr(new int(*n.xptr)){//复制构造函数
22
23     cout << "Calling copy constructor..." << endl;
24
25   //注:
26
27   //•&&是右值引用
28
29   //•函数返回的临时变量是右值
30
31   }
32
33  IntNum(IntNum && n): xptr( n.xptr){ //移动构造函数
34
35    n.xptr = nullptr;
36   
37    cout << "Calling move constructor..." << endl;
38
39   }
40
41   ~IntNum(){ //析构函数
42
43     delete xptr;
44
45     cout << "Destructing..." << endl;
46
47   }
48
49 private:
50
51   int *xptr;
52
53 };
54
55 //返回值为IntNum类对象
56
57   IntNum getNum() {
58
59   IntNum a;
60
61   return a;
62
63 }
64
65 int main() {
66
67   cout << getNum().getInt() << endl; return 0;
68
69 }
70
71 //运行结果:
72
73 Calling constructor...
74
75 Calling move constructor...
76
77 Destructing...
78
79 0
80
81 Destructing...

c++移动构造的更多相关文章

  1. 学习笔记:Maven构造版本号的方法解决浏览器缓存问题

    需要解决的问题 在做WEB系统开发时,为了提高性能会利用浏览器的缓存功能,其实即使不显式的申明缓存,现代的浏览器都会对静态文件(js.css.图片之类)缓存.但也正因为这个问题导致一个问题,就是资源的 ...

  2. 一步步构造自己的vue2.0+webpack环境

    前面vue2.0和webpack都已经有接触了些(vue.js入门,webpack入门之简单例子跑起来),现在开始学习如何构造自己的vue2.0+webpack环境. 1.首先新建一个目录vue-wk ...

  3. About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷

    构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...

  4. Eos开发——构造查询条件

    1.ajax 方式 var data = { orgid :orgid,year:year ,month: month,type:type,sortField:'sellEmpname' ,sortO ...

  5. 【C++】类和对象(构造与析构)

    类 类是一种抽象和封装机制,描述一组具有相同属性和行为的对象,是代码复用的基本单位. 类成员的访问权限 面向对象关键特性之一就是隐藏数据,采用机制就是设置类成员的访问控制权限.类成员有3种访问权限: ...

  6. Spring 设值注入 构造注入 p命名空间注入

    注入Bean属性---构造注入配置方案 在Spring配置文件中通过<constructor-arg>元素为构造方法传参 注意: 1.一个<constructor-arg>元素 ...

  7. 并发包的线程池第二篇--Executors的构造

    上一篇讲述了ThreadPoolExecutor的执行过程,我们也能看出来一个很明显的问题:这个线程池的构造函数比较复杂,对于不十分理解其运作原理的程序员,自己构造它可能体现和想象中不一样的行为.比如 ...

  8. 10、代码块、构造代码块、静态代码块及main方法之间的关系

    1.普通代码块: 在方法或语句中出现在{}之间的类容就称为普通代码块,简称代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”,即顺序执行. /*下面第一个类时合法的 ...

  9. json 构造和解析

    目录: (1)引入jar包: (2)json的构造: (3)json的解析: (4)遍历未知key. (1)java对json的处理,可借助org.json.jar. <!-- https:// ...

  10. c++拷贝构造和编译优化

    #include <iostream> using namespace std; class MyClass { public: MyClass(); MyClass(int i); My ...

随机推荐

  1. HDU 1754线段树

    第一个自己动手写的线段树,1Y还是有点小激动哈(虽然是模版题) 1 #include<cstdio> 2 #include<cstring> 3 #include<alg ...

  2. java随机数的产生

    两种产生随机数的方法: 1.通过import java.util.Random来实现 2.Math.random() 一.第一种的话就是导入Random之后,先生成一个Random对象r,之后再利用r ...

  3. Codeforces Round #327 (Div. 1) C. Three States

    C. Three States time limit per test 5 seconds memory limit per test 512 megabytes input standard inp ...

  4. C# 之 dynamic

    C#中的dynamic用于避免编译时类型检查,编译器在运行时获取类型. dynamic无法使用VisualStudio的intelliSense(智能感知),即调用dynamic修饰的对象的方法或字段 ...

  5. Jpress小程序

    首页轮播.首页公告.首页宫格.个人中心页面均支持在PC后台设置内容 首页列表.分类列表页.搜索列表的文章展示页均支持后台设置,拥有三种风格 所有分类展示支持两种风格 用户中心授权登陆,查看个人数据 J ...

  6. Chrony时间同步

    chrony 服务器 yum -y install chrony cp /etc/chrony.conf{,.bak} #备份默认配置 cat > /etc/chrony.conf <&l ...

  7. VS2010的单元测试(二)

    四.附加测试属性 附加测试属性,在默认生成的测试代码是使被注释掉的,取消注释就可以使用. 例如,要在执行测试前,输出测试开始时间,在执行测试后,输出测试结束时间.代码如下: [ClassInitial ...

  8. 51nod-1065 最小正子段和 【贪心 + 思维】

    N个整数组成的序列a[1],a[2],a[3],-,a[n],从中选出一个子序列(a[i],a[i+1],-a[j]),使这个子序列的和>0,并且这个和是所有和>0的子序列中最小的. 例如 ...

  9. c# 类(2)

    构造函数 和 析构函数 Constructors and destructors 构造函数是一个特殊的函数,当实例化一个类的时候自动调用这个函数,无返回值(不用定义返回类型)普通函数的定义 publi ...

  10. ARMv7-A 架构下的MMU

    ARM架构中MMU的作用主要就是将CPU发出的虚拟地址转换成为物理地址,从实现内核和用户程序和用户程序之间的虚拟地址空间隔离.MMU的主要组成为两部分,其一是内部的TLBs缓存:还有就是转换表装换单元 ...