- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++对象的浅复制和深复制详解及简单实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
C++对象的浅复制和深复制详解及简单实例 。
浅复制:两个对象复制完成后共享某些资源(内存),其中一个对象的销毁会影响另一个对象 。
深复制:两个对象复制完成后不会共享任何资源,其中一个对象的销毁不会影响另一个对象 。
下面我们来看一段代码,以便直观的理解:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include<iostream>
#include<string.h>
using
namespace
std;
class
Student
{
int
no;
char
*pname;
public
:
Student();
Student(
int
n,
char
* p);
~Student();
void
display();
};
Student::Student(){}
Student::Student(
int
n,
char
* p)
{
no=n;
pname=
new
char
[10];
strcpy
(pname,p);
}
Student::~Student()
{
delete
[]pname;
}
void
Student::display()
{
cout<<
"学号:"
<<no<<
",姓名:"
<<pname<<endl;
}
void
main()
{
Student s(10,
"xiaoming"
),t;
t=s;
cout<<
"s="
;
s.display();
cout<<
"t="
;
t.display();
}
|
这段程序看上去是正确的,但是执行就会出错,原因就是复制语句t=s,此语句执行的复制是浅复制,s将pname指针指向的地址赋给s的pname,它们就会指向相同的内存空间,当t被析构时,t.pname所指的内存空间就被释放了,再执行s的析构函数就会出错.
如果采用深复制就可以避免这个问题,下面我们用运算符重载函数实现深复制:
1
2
3
4
5
6
7
8
|
Student& Student::operator = (Student& s)
{
no=s.no;
int
len=
strlen
(s.pname);
pname=
new
char
[len+1];
strcpy
(pname,s.pname);
return
*
this
;
}
|
在执行t=s时,运算符重载函数内已为t分配内存空间.
对于上述运算符重载函数有两点说明:
1.形参一定要是引用类型,否则执行t=s时,就要先将实参s复制到形参s,这个过程是浅复制,没有为形参s分配内存空间,运行会出错; 。
2.返回值一定要是引用类型,因为执行t=s相当于执行t.=(s),若返回值不是引用类型,那么还要将函数的返回对象复制到t,又会出错 。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。
最后此篇关于C++对象的浅复制和深复制详解及简单实例的文章就讲到这里了,如果你想了解更多关于C++对象的浅复制和深复制详解及简单实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
免责声明 这篇文章是关于术语“浅拷贝”和“深拷贝”的正确用法,特别是在谈论复制一个不包含任何引用的对象时。这个问题并不意味着(也不应该)基于意见,除非真的没有关于这个话题的共识。我已将此问题标记为 C
我有这个功能 int getrelation(string name, RELATION& output){ bool found=0; int index=0;
与 why should I make a copy of a data frame in pandas 有关 我注意到在流行的backtesting图书馆, def __init__(self, d
我的问题很基础,但我想 100% 理解所有内容。 SO中的很多问题都引用了我的帖子,但我没有找到满意的答案。 我们知道java中的枚举是引用类型。让我们考虑以下片段: public static cl
请引用这个 fiddle 的问题。 http://jsfiddle.net/AQR55/ 1)为什么附加到隔离范围属性的 watch - 双向绑定(bind)到父属性,不会在更改父范围属性时触发。 在
我想使用 UP3 来完成一项非常具体的任务,我应该能够使用 API 来实现该任务。我想了解是否可以编写以下应用程序。 基于https://jawbone.com/support/articles/00
如何在辅助方法中传递上下文并提取数据? 请参阅以下代码片段: import AppContext from '../../context/AppContext' import extractDatta
我正在尝试使用 simple-git 创建浅克隆。我正在尝试创建与此命令等效的命令:git clone --depth 1 https://github.com/steveukx/git-js.git
我是一名优秀的程序员,十分优秀!