下面随笔给出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. 1569: Wet Tiles

    Description Alice owns a construction company in the town of Norainia, famous for its unusually dry ...

  2. Codeforces Round #579 (Div. 3) E. Boxers (贪心)

    题意:给你一组数,每个数都可以进行一次加一减一,问最后最多能有多少不同的数. 题解:我们可以用桶存每个数的次数,然后枚举\([1,150001]\)来求对答案的贡献,然后贪心,这里我们不用担心其他乱七 ...

  3. Java 窗口 小马图像窗口

    写在前面: eclipse接着爽到 全是借鉴的,东改西改,而且记不住原网址了 两个月前写的,忘了思路,嗯,It just works 运行效果: 图像随便选(放到*jar所在目录*\\pictures ...

  4. Codeforces Round #531 (Div. 3) B. Array K-Coloring (结构体排序)

    题意:给你\(n\)个数字,用\(k\)种颜色给他们涂色,要求每个数字都要涂,每种颜色都要用,相同的数字不能涂一样的颜色. 题解:用结构体读入每个数字和它的位置,然后用桶记录每个数字出现的次数,判断是 ...

  5. codeforce 849A

    A. Odds and Ends time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  6. ubuntu+将主机编译的库链接到虚拟环境Python中

    这里且以opencv为例: cd ~/.virtualenvs/YOUR_ENV/lib/python3.5/site-packages/ ln -s /usr/local/lib/python3.5 ...

  7. CDD All In One

    CDD All In One 组件驱动开发 (CDD) refs https://www.componentdriven.org/ https://www.learnstorybook.com/int ...

  8. GraphQL All In One

    GraphQL All In One refs https://github.com/hasura/learn-graphql xgqfrms 2012-2020 www.cnblogs.com 发布 ...

  9. Android 如何使用 WebView 加载 HTML 字符串和处理转译字符

    Android 如何使用 WebView 加载 HTML 字符串和处理转译字符 css bug 在 WebView 中编译 Web 应用 如果您希望在客户端应用中提供 Web 应用(或只是网页),则可 ...

  10. AirPods 2 声音非常小

    AirPods 2 声音非常小 bug 停用蓝牙绝对音量 可能是因为开启了耳机的绝对音量功能; 绝对音量功能开启后,耳机的音量和手机音量分开, 可以在手机设置里停用绝对音量; refs http:// ...