下面随笔给出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. Codeforces Round #673 (Div. 2) D. Make Them Equal(数论/构造)

    题目链接:https://codeforces.com/contest/1417/problem/D 题意 给出一个大小为 $n$ 的正整数数组 $a$ ,每次操作如下: 选择 $i,j$ 和 $x$ ...

  2. AtCoder Beginner Contest 176

    比赛链接:https://atcoder.jp/contests/abc176 A - Takoyaki #include <bits/stdc++.h> using namespace ...

  3. BZOJ2882 工艺【SAM】 最小循环串

    BZOJ2882 工艺 给出一个串,要求其循环同构串中字典序最小的那个 串翻倍建\(SAM\)然后从起点开始贪心的跑\(n\)次即可 当然也能用最小表示法来做 #include<bits/std ...

  4. P3803 [模板] 多项式乘法 (FFT)

    Rt 注意len要为2的幂 #include <bits/stdc++.h> using namespace std; const double PI = acos(-1.0); inli ...

  5. 【poj 2976】Dropping tests(算法效率--01分数规划 模版题+二分){附【转】01分数规划问题}

    P.S.又是一个抽时间学了2个小时的新东西......讲解在上半部分,题解在下半部分. 先说一下转的原文:http://www.cnblogs.com/perseawe/archive/2012/05 ...

  6. HDU 1564 Play a game && HDU 2147 kiki's game

    HDU 1564 Play a game题意: 棋盘的大小是n*n.一块石头被放在一个角落的广场上.他们交替进行,8600人先走.每次,玩家可以将石头水平或垂直移动到一个未访问的邻居广场.谁不采取行动 ...

  7. 51Nod - 1632

    B国拥有n个城市,其交通系统呈树状结构,即任意两个城市存在且仅存在一条交通线将其连接.A国是B国的敌国企图秘密发射导弹打击B国的交通线,现假设每条交通线都有50%的概率被炸毁,B国希望知道在被炸毁之后 ...

  8. BIM轻量化——浏览器展示

    此篇博客仅为记录,记录钻研过程的零碎思路.         之前考虑过很多可能性,对rvt文件转换格式:.obj.JSON..gltf等等.这些可能性前人一般都尝试过,而且也都做出来了东西.     ...

  9. codeforces 1036B - Diagonal Walking v.2【思维+构造】

    题目:戳这里 题意:起点(0,0),终点(n,m),走k步,可以走8个方向,问能不能走到,能走到的话最多能走多少个斜步. 解题思路:起点是固定的,我们主要分析终点.题目要求走最多的斜步,斜步很明显有一 ...

  10. 2019牛客多校第五场C generator 2(BSGS)题解

    题意: 传送门 已知递推公式\(x_i = a*x_{i - 1} + b\mod p\),\(p\)是素数,已知\(x_0,a,b,p\),给出一个\(n\)和\(v\),问你满足\(x_i = v ...