浅拷贝
- 浅拷贝是指仅复制对象的引用而不复制其所指向的数据。换言之,当进行浅拷贝时,原对象和新对象共享同一份数据,修改其中一个对象会影响另一个对象。
- 修改新对象中引用类型的成员变量会影响原始对象,因为它们引用的是同一个对象。
深拷贝
- 深拷贝创建一个新对象,并递归地复制原始对象及其所有引用类型的成员变量,而不仅仅是复制引用。因此,修改新对象中的引用类型成员不会影响原始对象。
- 深拷贝需要注意循环引用的情况,以避免无限递归。
-
换言之,当进行深拷贝时,原对象和新对象各自拥有独立的数据副本,修改其中一个对象不会影响另一个对象。
例如
#include <iostream>
#include <string>
class Person {
public:
std::string name;
int age;
// 默认构造函数
Person() : name(""), age(0) {}
// 自定义构造函数
Person(const std::string& n, int a) : name(n), age(a) {}
// 浅拷贝
Person shallowCopy() {
return *this;
}
// 深拷贝
Person deepCopy() {
return Person(name, age);
}
};
int main() {
// 原始对象
Person originalPerson("John", 25);
// 浅拷贝
Person shallowCopy = originalPerson.shallowCopy();
// 深拷贝
Person deepCopy = originalPerson.deepCopy();
// 修改拷贝的值
shallowCopy.name = "Bob";
deepCopy.name = "Alice";
// 输出原始对象的信息
std::cout << "Original Person:" << std::endl;
std::cout << "Name: " << originalPerson.name << std::endl;
std::cout << "Age: " << originalPerson.age << std::endl;
// 输出浅拷贝的信息
std::cout << "\nShallow Copy:" << std::endl;
std::cout << "Name: " << shallowCopy.name << std::endl;
std::cout << "Age: " << shallowCopy.age << std::endl;
// 输出深拷贝的信息
std::cout << "\nDeep Copy:" << std::endl;
std::cout << "Name: " << deepCopy.name << std::endl;
std::cout << "Age: " << deepCopy.age << std::endl;
return 0;
}
//输出结果
//Original Person:
//Name: John
//Age: 25
//Shallow Copy:
//Name: Bob
//Age: 25
//Deep Copy:
//Name: Alice
//Age: 0
- 原始对象的名字是 "John",年龄是 25。
- 浅拷贝后,修改了浅拷贝的名字为 "Bob",但年龄保持不变(25)。
- 深拷贝后,修改了深拷贝的名字为 "Alice",而年龄因为深拷贝时并没有复制,所以保持为默认值(0)。
这样可以看出,在浅拷贝中,对象的成员属性被共享,而在深拷贝中,对象的属性值被复制到了新对象,两者互不影响。