创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
c语言内容💖:
专栏:c语言之路重点知识整合
【c语言】全部知识点总结
目录
- 一、浅拷贝
- 二、深拷贝
- 总结
一、浅拷贝
浅拷贝是简单的赋值拷贝操作
浅拷贝是指在对象复制过程中,只会简单地复制对象的值,包括指针的地址,而不复制指针所指向的内容
新对象和原对象将共享同一块内存,如果其中一个对象修改了这块内存,那么另一个对象也会受到影响
#include <iostream>
using namespace std;class Person
{
public:int* data; Person(int v) {data = new int;*data = v;}// 浅拷贝Person(const Person& other){data = other.data; // 浅拷贝,只复制指针地址data = new int(*other.data);}; //析构函数~Person() {delete data;}
};int main()
{Person test1(42);Person test2(test1);// 修改test1中的data*(test1.data) = 10;// 输出test2中的data,会发现也被修改了cout << "对象test2: " << *(test2.data) << endl;return 0;
}
由于浅拷贝只复制了指针地址,所以两个对象共享同一块内存,因此修改test1.data
导致了test2.data
也被修改
在修改一个对象时,另一个对象也受到影响
二、深拷贝
深拷贝是在堆区重新申请空间,进行拷贝操作
深拷贝是指在对象复制过程中,不仅复制对象的值,还复制指针所指向的内容
这意味着新对象将有其独立的内存副本,对其中一个对象进行修改不会影响到另一个对象
拷贝构造函数中通过为m_height
分配新存并复制p.m_age
和p.m_height
的值来执行深拷贝:
#include<iostream>
using namespace std;class Person
{
public:int m_age;int* m_height;//无参(默认)构造函数Person() {cout << "调用无参构造函数Person()" << endl;}//有参构造函数Person(int age, int height) {cout << "调用有参构造函数Person(int age, int height) " << endl;m_age = age;m_height = new int(height);}//拷贝构造函数 Person(const Person& p) {cout << "调用拷贝构造函数Person(const Person& p)" << endl;//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题m_age = p.m_age;m_height = new int(*p.m_height);}//析构函数~Person() {cout << "调用析构函数" << endl;if (m_height != NULL){delete m_height;}}void test01()
{Person p1(18, 180);Person p2(p1);cout << "p1的年龄: " << p1.m_age << " 身高: " << *p1.m_height << endl;cout << "p2的年龄: " << p2.m_age << " 身高: " << *p2.m_height << endl;
}int main()
{test01();return 0;
}
};
总结
在C++中,默认的拷贝构造函数和赋值操作符执行的是浅拷贝。当类中包含指针成员时,会出现问题
为了避免浅拷贝带来的问题,可以自定义拷贝构造函数和赋值操作符,以执行深拷贝
深拷贝通过为新对象动态分配内存,并复制指针所指向的内容,从而确保每个对象具有独立的内存块
在修改一个对象时不会影响其他对象
如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |