下面随笔给出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. poj 3468A Simple Problem with Integers

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  2. Codeforces Educational Rounds 85 A~C

    A:Level Statistics 题意:统计n个游戏数据,p代表游玩次数,c代表通关次数,每次游玩都不一定通关,求这些数据是否合法 题解:1.游玩次数不能小于通关次数   2.游玩次数和通关次数必 ...

  3. 利用windows api共享内存通讯

    主要涉及CreateFile,CreateFileMapping,GetLastError,MapViewOfFile,sprintf,OpenFileMapping,CreateProcess Cr ...

  4. mysql 索引类型以及创建

    明天就去面浦发了,感觉对数据库有些忘了,时间紧迫,就直接把链接贴这了,有空再整理. 参考: 1. https://www.cnblogs.com/crazylqy/p/7615388.html

  5. 域渗透——获得域控服务器的NTDS.dit文件

    0x00 前言 在之前的文章<导出当前域内所有用户hash的技术整理>曾介绍过通过Volume Shadow Copy实现对ntds.dit文件的复制, 可用来导出域内所有用户hash.本 ...

  6. 正则表达式 js 怎么获取匹配的变量

    正则表达式 js 怎么获取匹配的变量 $0 ~ $9 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  7. Windows 常用键盘快捷键:

    键盘快捷键 通过使用键盘快捷键可以节省时间. Windows 和 Mac 的键盘快捷键 在现代操作系统中和计算机软件程序中,键盘快捷键经常被使用. 使用键盘快捷键能帮您节省很多时间. 基本的快捷键 描 ...

  8. pure CSS3 实现三角形icon的方法

    pure CSS3 实现三角形icon的方法 border: color+transparent transform : rotate() /rotateZ() ? 使用 实体字符"◆&qu ...

  9. js currying All In One

    js currying All In One 柯里化 refs https://juejin.im/post/6844903603266650125 xgqfrms 2012-2020 www.cnb ...

  10. Right in the Center (js string algorithm)

    Right in the Center (js string algorithm) codewars https://www.codewars.com/kata/5f5da7a415fbdc0001a ...