c++浅拷贝和深拷贝
作者:野牛程序员:2023-07-21 08:22:00 C++阅读 2673
在 C++ 中,拷贝构造函数和赋值运算符涉及两种拷贝方式:浅拷贝和深拷贝。这两种拷贝方式适用于类中包含动态分配内存或指针的情况。
浅拷贝(Shallow Copy): 浅拷贝是简单地复制一个对象的内容到另一个对象,包括指针变量的值(地址)。这意味着两个对象将指向同一块内存,因此对其中一个对象的修改会影响到另一个对象。
示例:
#include <iostream>
class ShallowCopyExample {
private:
int* data;
public:
ShallowCopyExample(int value) {
data = new int;
*data = value;
}
// 拷贝构造函数(浅拷贝)
ShallowCopyExample(const ShallowCopyExample& other) {
data = other.data; // 这里进行了浅拷贝
}
// 析构函数释放动态分配的内存
~ShallowCopyExample() {
delete data;
}
int getData() const {
return *data;
}
};
int main() {
ShallowCopyExample obj1(42);
ShallowCopyExample obj2 = obj1; // 调用拷贝构造函数进行浅拷贝
std::cout << "Object 1 data: " << obj1.getData() << std::endl;
std::cout << "Object 2 data: " << obj2.getData() << std::endl;
// 修改 obj1 的数据,会影响 obj2,因为它们共享同一块内存
*obj1.data = 99;
std::cout << "After modifying obj1:" << std::endl;
std::cout << "Object 1 data: " << obj1.getData() << std::endl;
std::cout << "Object 2 data: " << obj2.getData() << std::endl;
return 0;
}输出:
Object 1 data: 42 Object 2 data: 42 After modifying obj1: Object 1 data: 99 Object 2 data: 99
深拷贝(Deep Copy): 深拷贝是创建一个新的对象,并将原始对象中指针所指向的内容复制到新对象中的新内存地址。这样,两个对象是相互独立的,修改一个对象的数据不会影响到另一个对象。
示例:
#include <iostream>
class DeepCopyExample {
private:
int* data;
public:
DeepCopyExample(int value) {
data = new int;
*data = value;
}
// 拷贝构造函数(深拷贝)
DeepCopyExample(const DeepCopyExample& other) {
data = new int; // 创建新的内存空间
*data = *other.data; // 复制原始对象的数据
}
// 析构函数释放动态分配的内存
~DeepCopyExample() {
delete data;
}
int getData() const {
return *data;
}
};
int main() {
DeepCopyExample obj1(42);
DeepCopyExample obj2 = obj1; // 调用拷贝构造函数进行深拷贝
std::cout << "Object 1 data: " << obj1.getData() << std::endl;
std::cout << "Object 2 data: " << obj2.getData() << std::endl;
// 修改 obj1 的数据,不会影响 obj2,因为它们拥有独立的内存空间
*obj1.data = 99;
std::cout << "After modifying obj1:" << std::endl;
std::cout << "Object 1 data: " << obj1.getData() << std::endl;
std::cout << "Object 2 data: " << obj2.getData() << std::endl;
return 0;
}输出:
Object 1 data: 42 Object 2 data: 42 After modifying obj1: Object 1 data: 99 Object 2 data: 42
注意:在实际使用中,要根据情况决定是使用浅拷贝还是深拷贝,以确保对象之间的行为和数据符合预期。在包含动态内存分配的情况下,深拷贝通常是更安全的选择,因为它避免了因浅拷贝引起的潜在问题。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

- 上一篇:深拷贝c++函数
- 下一篇:c++ 拷贝构造函数
