类和对象-对象特性-深拷贝和浅拷贝

本文详细阐述了C++中深拷贝与浅拷贝的区别,尤其是在Person类中的拷贝构造函数实现,强调了动态内存管理的重要性,以及析构函数的作用。指出当对象包含堆区开辟的内存时,自定义拷贝构造函数以避免浅拷贝问题的必要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深拷贝和浅拷贝

#include<bits/stdc++.h>
using namespace std;

class Person{
public:
	Person(){
		cout<<"Person的默认构造函数调用"<<endl;
	} 
	Person(int age,int height){
		cout<<"Person的有参构造函数调用"<<endl;
		m_Age=age;
		m_Height=new int(height);
	}
	Person(const Person &p){
		cout<<"Person的拷贝构造函数调用"<<endl;
		m_Age=p.m_Age;
		//m_Height=p.m_Height; 编译器默认实现就是这行代码
		//深拷贝操作
		m_Height=new int(*p.m_Height); 
	}
	~Person(){
		//析构代码,将堆区开辟数据做释放操作
		if(m_Height!=NULL){
			delete m_Height;
			m_Height=NULL;
		} 
		cout<<"Person的析构函数调用"<<endl;
	}
	int m_Age; 
	int *m_Height;
};
void test01(){
	Person p1(18,160);
	cout<<"p1的年龄为:"<<p1.m_Age<<" 身高为:"<<*p1.m_Height<<endl;
	Person p2(p1);
	cout<<"p2的年龄为:"<<p2.m_Age<<" 身高为:"<<*p2.m_Height<<endl;
}
int main(){
	test01();
	return 0;
}
  1. 对象拷贝和拷贝构造函数:
  • test01() 中,通过 Person p2(p1); 进行对象 p1 到对象 p2 的拷贝初始化。
  • 这里会调用 Person 类中的拷贝构造函数来完成对象的拷贝操作。
  1. 拷贝构造函数的实现:
  • Person 类中定义了拷贝构造函数 Person(const Person &p)
  • 在拷贝构造函数中,进行了深拷贝操作,即对 m_Height 所指向的动态内存进行了新的分配,避免了浅拷贝带来的问题。
  1. 动态内存管理:
  • Person 类中,使用了动态内存分配来存储身高信息,通过 new int(height) 来动态分配内存。
  • 在拷贝构造函数和析构函数中,需要正确管理动态分配的内存,避免内存泄漏或重复释放的问题。
  1. 析构函数的作用:
  • Person 类中,定义了析构函数 ~Person(),用于释放动态分配的内存。
  • 在析构函数中,通过 delete 关键字释放了 m_Height 所指向的动态内存,并将指针置为 NULL,以防止悬空指针。
  1. 拷贝构造函数的必要性:
  • 因为 Person 类中存在动态分配的内存,所以需要自定义拷贝构造函数来确保对象的深拷贝,避免浅拷贝带来的问题。
  1. 如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值