当前位置: 首页 > article >正文

[C++ 核心编程]笔记 4.2.5 深拷贝与浅拷贝

4.2.5 深拷贝与浅拷贝

深浅拷贝是面试经典问题,也是常见的一个坑

  • 浅拷贝: 简单的赋值拷贝操作
  • 深拷贝: 在堆区重新申请空间,进行拷贝操作

注意:

  1. 浅拷贝带来的问题是堆区的内存重复释放
  2. 深拷贝可以解决浅拷贝的的问题
  3. 如果有属性在堆区开辟的, 一定要自己提供拷贝构造函数, 防止浅拷贝带来的问题
  4. 如果在堆区开辟了内存, 要自己写析构代码将其释放干净, 否则容易报错
#include<iostream>
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();

	system("pause");
	return 0;
}

http://www.kler.cn/a/381087.html

相关文章:

  • 递归查询全量分页数据问题
  • Vue.js 响应接口
  • 智能体实战(需求分析助手)一、需求概述及迭代规划
  • Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
  • 数据库管理系统——数据库设计
  • Leetcode中最常用的Java API——util包
  • Hive学习笔记
  • SQL入门的基础知识
  • SQL 像英语是个善意的错误
  • openapi回调地址请求不通过
  • 医院信息化与智能化系统(17)
  • iOS 再谈KVC、 KVO
  • 【Web自动化】探索Selenium与WebDriver的核心原理
  • Python OpenCV 图像改变
  • AI大模型赋能医学诊疗与药学服务——课题基金申请辅导项目成功举办
  • 安装Blender并使用
  • 【C++之STL】一文学会使用 string
  • 代码随想录之哈希表刷题总结
  • Redis学习:1. Redlock算法(MultiLock)和底层源码分析、2. Redis缓存过期淘汰策略
  • 【天线&运输】冲浪者检测系统源码&数据集全套:改进yolo11-DySnakeConv
  • C# 常用的测试框架合集
  • Oracle 第22章:数据仓库与OLAP
  • 【持续更新】【NLP项目】【自然语言处理】智能聊天机器人——“有问必答”【Chatbot】第1章、《系统、环境》
  • 论文解读:《Consensus-Aware Visual-Semantic Embedding for Image-Text Matching》
  • java.io.IOException: Too many open files
  • qt QPicture详解