前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >拷贝构造与深浅拷贝

拷贝构造与深浅拷贝

作者头像
洁洁
发布2023-10-10 13:38:55
1620
发布2023-10-10 13:38:55
举报
文章被收录于专栏:小洁叫你mysql

一、拷贝构造函数

如果一个构造函数的第一个参数是自身类型的引用,而且任何额外参数都有默认值,则此构造函数是拷贝构造函数。

代码语言:javascript
复制
class person
{
public:
person();             //默认构造函数
person(const person&);//拷贝构造函数
};

拷贝构造函数的第一个参数必须是一个引用类型。 如果没有定义一个拷贝构造函数,编译器会自动为我们定义一个,与合成拷贝构造函数。 合成拷贝构造函数用来阻止我们拷贝该类类型的对象。合成的拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中。每个成员的类型决定了它如何拷贝,对于类类型的成员,会使用其拷贝构造函数来拷贝,内置类型的成员则直接拷贝。

二、拷贝初始化

代码语言:javascript
复制
//直接初始化
string dot(100,',');
string ss(dot);
//拷贝初始化
string s1=dot;
string s2="1324135";
string s3=string(100,'2');

直接初始化,实际要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。 拷贝初始化,要求编译器将右侧运算对象拷贝到正在创建的对象中,如果有需要还要进行类型转换。

三、深浅拷贝

先来看代码

代码语言:javascript
复制
#include<iostream>
using namespace std;
class person
{
public:
	person()
	{
		cout << "person()的默认构造" << endl;
	}
	person(int age,int hight)
	{
		myage = age;
		myheight =new int( hight);
		cout << "person()的有参函数构造" << endl;
	}
	//shenkaobei
	person(const person& p)
	{
		myage = p.myage;
		//myheight = p.myheight;编译器默认(浅拷贝)提供的
		//因为是指针地址,会导致两个名释放同一块内存空间
		//深拷贝
		myheight = new int(*p.myheight);
	}
	~person()
	{
		//析构函数将,堆区 ,开辟的数据进行释放
		if (myheight != NULL)
		{
			delete myheight;
			myheight = NULL;
		}
		cout << "person()的析构函数构造" << endl;
	}
	int myage;
	int* myheight;
};
void test01()
{
	person p1(10,120);


	person p2(p1);
	cout << p2.myage<<endl <<*p2.myheight<< endl;
	return;
}
int main()
{
	test01();
	system("pause");
	return 0;
}

浅拷贝:myage = p.myage; 深拷贝:myheight = new int(*p.myheight); 拷贝函数:person p2(p1);、 进行析构时,由于创建了两个对象。p1,p2,所以析构时会调用两次析构函数,所以如果要是进行浅拷贝的话,myheight=p.myheight;

在这里插入图片描述
在这里插入图片描述

相当于把地址赋值给p2,两个p1 p2指向同一块内存,所以再释放时 会释放两次。 而深拷贝则会从新开辟一块内存,从而防止同一块内存释放两次。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、拷贝构造函数
  • 二、拷贝初始化
  • 三、深浅拷贝
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档