网站首页 > 基础教程 正文
01
引言
在C++中,拷贝构造函数和赋值操作符可以用于创建对象的副本,这些副本的创建方式可以是浅拷贝(shallow copy)或深拷贝(deep copy)。理解这两者之间的区别对于正确地管理资源和避免潜在的错误至关重要。
02
浅拷贝 Shallow Copy
浅拷贝是指在创建对象的副本时,仅仅复制了原始对象中成员变量的值。如果对象中包含指针或动态分配的资源,浅拷贝只是复制了这些指针的值,而不是它们指向的资源。因此,原始对象和副本对象会共享相同的资源,指向同一片内存。
class ShallowCopyExample {
public:
int* data;
ShallowCopyExample(int size) {
data = new int[size];
}
// 拷贝构造函数
ShallowCopyExample(const ShallowCopyExample& other) {
data = other.data; // 仅复制指针,不复制数据
}
// 析构函数
~ShallowCopyExample() {
delete[] data;
}
};
在这个例子中,拷贝构造函数执行了浅拷贝,因为它只是复制了data指针,而不是指针指向的整组数据。
03
深拷贝 Deep Copy
深拷贝是指在创建对象的副本时,不仅复制了原始对象的成员变量,还复制了这些成员变量指向的资源。如果对象包含指针或动态分配的资源,深拷贝会为副本分配新的资源,并复制原始资源的内容。
class DeepCopyExample {
public:
int* data;
size_t size;
DeepCopyExample(size_t sz) : size(sz) {
data = new int[sz];
}
// 拷贝构造函数
DeepCopyExample(const DeepCopyExample& other) {
size = other.size;
data = new int[size];
std::copy(other.data, other.data + size, data); // 复制数据
}
// 析构函数
~DeepCopyExample() {
delete[] data;
}
};
在这个例子中,拷贝构造函数执行了深拷贝,因为它为副本分配了新的内存,并复制了原始对象data指针指向的所有数据。
04
小结
- 浅拷贝通常用于那些不拥有资源或资源可以共享的对象。
- 深拷贝通常用于对象拥有资源,并且每个副本都应该拥有独立的资源副本。
- 默认情况下,C++的复制构造函数和赋值操作符会执行浅拷贝,特别是当类包含指针或动态分配的资源时。这意味着,如果类中包含指针成员,复制构造函数会复制这些指针的值,而不是它们指向的资源。这可能导致原始对象和副本对象共享相同的资源,从而引发潜在的资源管理问题。
- 在实现拷贝构造函数和赋值操作符时,开发者根据对象的资源管理需求来决定使用浅拷贝还是深拷贝。如果不正确地管理这些资源,可能会导致内存泄漏、悬挂指针或其他资源管理错误。C++也提供了std::move可以帮助实现移动语义,这是介于浅拷贝和深拷贝之间的一种资源转移方式。
猜你喜欢
- 2024-10-12 全面剖析 C++ Boost 智能指针!| CSDN 博文精选
- 2024-10-12 C++设计模式——原型模式 设计模式之原型模式
- 2024-10-12 如何攻克 C++ 中复杂的类型转换? c++中四种类型转换的方式
- 2024-10-12 C++|由成员函数到运算符重载(类内、类外、友元方式重载)
- 2024-10-12 C++11新特性(49)- 用移动类对象代替拷贝类对象
- 2024-10-12 C++类的默认成员函数 c++类中定义的成员默认访问属性为( )
- 2024-10-12 C++的23种设计模式(上篇-创建型模式)
- 2024-10-12 C++构造函数和析构函数详解 c语言构造函数和析构函数
- 2024-10-12 c++——默认成员函数 c++成员变量默认值
- 2024-10-12 C++|类中实现操作符重载,用操作符代替成员函数名
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)