C++中深浅拷贝的介绍

举报
努力变强的小C 发表于 2022/09/28 21:25:24 2022/09/28
972 0 0
【摘要】 C++中深浅拷贝的介绍

目录

什么是浅拷贝

new 和delete的使用方法

 浅拷贝的实例

什么是深拷贝

小结


什么是浅拷贝

所谓的浅拷贝就是由系统默认的拷贝构造函数对数据成员进行逐一的赋值,通常默认的拷贝构造函数就是可以达到该效果的,但是如果类中有指针类型的数据,那么此时的浅拷贝就会带来错误

下面我们来看一个由于浅拷贝中带有指针数据所引发错误的例子

下面会用到new 和delete的方法我先来讲解一下

new 和delete的使用方法

在c++中,new和delete是用来分配内存和释放内存的两个操作符,正如c中的malloc和free一样。因为malloc、calloc、realloc都是在堆上分配的,堆上分配的空间必须由用户自己来管理,如果不释放,就会造成内存泄漏。而栈上分配的空间是由编译器来管理的,具有函数作用域,出了函数作用域后系统会自动回收,不由用户管理,所以不用用户显式释放空间。

因此,如果你的函数里面声明指针的时候没有用到new来申请内存。就不用delete了。

         

 浅拷贝的实例

#include <iostream>
#include <string>
using namespace std; 
class Score {
	private:
		char *name;
		float score;
	public:
		Score(char *name1,float score1);	//创建一个自定义的构造函数
		~Score();				//首先声明一个析构函数
};
Score::Score(char *name1, float score1) {
	cout << "我是构造函数,现在已执行……" << name1 << endl;
	name = new char[strlen(name1) + 1];
	if(name != 0){
			strcpy(name,name1);
			score = score1;
	}
}
Score::~Score() {
	cout << "对象注销,现在自动执行析构函数了……" << name << endl;
	name[0] = '\0';
	delete[]name;
}
int main() {
	Score score1("周周", 100);
	Score score2 = score1;
	return 0;
}

该程序的输出结果是会报错的,程序开始运行的时候我们就创建score1对象就调用构造函数

用new运算符从内存中动态分配了一块内存,并且name指向这个内存块,因为我们没有定义拷贝构造函数,所以程序就自动将score1的所有数据成员一一赋值给了score2,这就使得这两个对象的数据成员的都是指向同一个内存,但是当第一个对象生命周期结束时,它相应的内存就被释放了,但是第二次对象score2又企图释放同一内存空间,这就导致的同一个内存空间的两次释放,这当然是不允许的,所以必然会引发错误

什么是深拷贝

深拷贝指的就是当拷贝对象中有对其他资源(如堆、文件、系统等)的引用时(引用可以是指针或引用)时,对象的另开辟一块新的资源,  

小结

 深拷贝和浅拷贝的区别就是在对象状态中包含其他对象的引用的时候,当拷贝一个对象时,如果需要拷贝这个对象引用的对象则是深拷贝,否则是浅拷贝。浅拷贝只是单单的对另对象赋值,而深拷贝则需另开辟一片空间来存放内容。 

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。