c++移动构造
下面随笔给出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++移动构造的更多相关文章
- 学习笔记:Maven构造版本号的方法解决浏览器缓存问题
需要解决的问题 在做WEB系统开发时,为了提高性能会利用浏览器的缓存功能,其实即使不显式的申明缓存,现代的浏览器都会对静态文件(js.css.图片之类)缓存.但也正因为这个问题导致一个问题,就是资源的 ...
- 一步步构造自己的vue2.0+webpack环境
前面vue2.0和webpack都已经有接触了些(vue.js入门,webpack入门之简单例子跑起来),现在开始学习如何构造自己的vue2.0+webpack环境. 1.首先新建一个目录vue-wk ...
- About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷
构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...
- Eos开发——构造查询条件
1.ajax 方式 var data = { orgid :orgid,year:year ,month: month,type:type,sortField:'sellEmpname' ,sortO ...
- 【C++】类和对象(构造与析构)
类 类是一种抽象和封装机制,描述一组具有相同属性和行为的对象,是代码复用的基本单位. 类成员的访问权限 面向对象关键特性之一就是隐藏数据,采用机制就是设置类成员的访问控制权限.类成员有3种访问权限: ...
- Spring 设值注入 构造注入 p命名空间注入
注入Bean属性---构造注入配置方案 在Spring配置文件中通过<constructor-arg>元素为构造方法传参 注意: 1.一个<constructor-arg>元素 ...
- 并发包的线程池第二篇--Executors的构造
上一篇讲述了ThreadPoolExecutor的执行过程,我们也能看出来一个很明显的问题:这个线程池的构造函数比较复杂,对于不十分理解其运作原理的程序员,自己构造它可能体现和想象中不一样的行为.比如 ...
- 10、代码块、构造代码块、静态代码块及main方法之间的关系
1.普通代码块: 在方法或语句中出现在{}之间的类容就称为普通代码块,简称代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”,即顺序执行. /*下面第一个类时合法的 ...
- json 构造和解析
目录: (1)引入jar包: (2)json的构造: (3)json的解析: (4)遍历未知key. (1)java对json的处理,可借助org.json.jar. <!-- https:// ...
- c++拷贝构造和编译优化
#include <iostream> using namespace std; class MyClass { public: MyClass(); MyClass(int i); My ...
随机推荐
- Codeforces Round #613 (Div. 2) B. Just Eat It!(前缀和)
题意: 一个长为n的序列,是否存在与原序列不同的连续子序列,其元素之和大于等于原序列. 思路: 从前.后分别累加,若出现非正和,除此累加序列外的子序列元素之和一定大于等于原序列. #include & ...
- poj 1410 (没做出来,记得闲着没事看看这道题)
听说这道题是个大大的坑题 结果wa了十多发,,,,还是没找到原因 #include<cstdio> #include<cmath> #include<algorithm& ...
- 【uva 11054】Wine trading in Gergovia(算法效率--等价转换)
题意:N个等距村庄,买(>0)卖(<0)酒,供需平衡,运K则需K劳动力.问所需的最小劳动力. 解法:由于运出或运入1的都需经过2,所以无论如何,都可以等价于从2本身运入或运出.因此可以将1 ...
- hdu5289 Assignment
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission ...
- JavaScript——内置对象
- shapefile 输出的地理处理注意事项(转载)
来源:http://resources.arcgis.com/zh-cn/help/main/10.1/index.html#//005600000013000000 多年来,Esri 为存储地理信息 ...
- codefroces 7C
C. Line time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- 使用 Jenkins 搭建 CI/CD All In One
使用 Jenkins 搭建 CI/CD All In One https://ci.jenkins.io/ https://www.jenkins.io/zh/ jobs pipelines refs ...
- 钉钉 & URL Scheme & Universal Link & Deep Link
钉钉 & URL Scheme & Universal Link & Deep Link DD link https://www.cnblogs.com/xgqfrms/p/1 ...
- convert number or string to ASCII in js
convert number or string to ASCII in js ASCII dictionary generator // const dict = `abcdefghijklmnop ...