1.概念
深拷贝(deep copy)和浅拷贝(shallow copy)是在编程中经常遇到的概念,尤其在处理数据结构或对象时很重要。深拷贝和浅拷贝是相对于类的成员指针变量而言的,如果类内不存在成员指针变量,就没有深拷贝和浅拷贝。
-
浅拷贝:在浅拷贝中,只复制了对象本身,而不复制对象内部包含的引用对象。简而言之,新对象的引用仍然指向原始对象内部的引用对象。这意味着如果你修改了新对象内部的引用对象,原始对象也会受到影响,因为它们共享相同的引用。通常,浅拷贝使用简单的赋值操作来实现。
-
深拷贝:深拷贝会复制对象本身以及对象内部的所有引用对象,包括引用对象内部的引用对象,以此类推。这样,原始对象和深拷贝后的对象是完全独立的,对一个对象的修改不会影响另一个对象。深拷贝通常需要递归地复制所有引用对象,确保每个对象都是全新的。
深拷贝和浅拷贝在不同情况下有不同的应用场景。通常情况下:
- 当你希望修改一个对象时,不影响原始对象,就应该使用深拷贝。
- 当对象较大且内部结构较为简单时,浅拷贝可能更高效
2. 浅拷贝
浅拷贝 :拷贝对象的时候,不对指针成员所指向的对象进行拷贝,而是两个对象的指针成员指向同一个对象。
示例:
class Phone
{
private:
string name;
public:
Phone(string name):name(name){}
};
class Person
{
private:
Phone* pPhone;//当一个对象里有指针类型成员时,才有必要去考虑深拷贝和浅拷贝
public:
Person()
{
pPhone = new Phone("诺基亚plus");
}
Phone* getPhone()
{
return pPhone;
}
};
int main()
{
Person* xiaoming = new Person();
Person xiaoqiang(*xiaoming);
//因Person中没有显式的定义拷贝构造函数,所以使用默认拷贝构造函数,默认拷贝构造函数的逻辑是浅拷贝
cout<<xiaoming->getPhone()<<endl;//这两个对象的phone指针应该指向同一个对象
cout<<xiaoqiang.getPhone()<<endl;
}
3.深拷贝
深拷贝:需要在对象的拷贝构造函数中对成员指针所指向的对象也进行拷贝。
#include <iostream>
using namespace std;
class Phone
{
string name;
public:
Phone(string name):name(name){}
};
class Person
{
Phone* pPhone;
public:
Person()
{
//创建一个手机
pPhone = new Phone("华为");
}
Phone* getP()
{
return pPhone;
}
//拷贝 this --> xq
Person(const Person& other) //const Person& other = xm;
{
cout<<"copy"<<endl;
this->pPhone = other.pPhone;
//1.找到小明的指针
// other.pPhone 指针 *other.pPhone 指针指向的对象
//2.按照小明的指针指向的对象 创建一个一模一样的
//new Phone(*other.pPhone)
//3.小强的指针 指向新对象
this->pPhone = new Phone(*other.pPhone);
}
};
//1.系统默认的拷贝构造:浅拷贝的过程
//2.浅拷贝:类中包含了一个成员指针,只对成员指针的指向 进行赋值
int main()
{
Person xm;
Person xq(xm);
cout<<xm.getP()<<endl;
cout<<xq.getP()<<endl;
return 0;
}
注意:
1.系统默认的拷贝构造函数是: 浅拷贝。
2.当类中有指针类型的成员时,才去考虑深拷贝和浅拷贝的问题。
最后的最后,希望大家点点赞,点点关注,谢谢大家!