本文主要是介绍C++中深拷贝与浅拷贝的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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 --> xqPerson(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;
}
这篇关于C++中深拷贝与浅拷贝的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!