深拷贝会为新对象分配独立内存并复制数据,确保对象间不共享资源;浅拷贝仅复制指针值,导致多个对象共享同一内存,可能引发重复释放问题。当类含有动态内存指针时,必须实现深拷贝以避免崩溃,同时遵循“三大法则”:若需析构函数、拷贝构造函数或赋值操作符之一,通常三者均需自定义。

在C++中,深拷贝和浅拷贝是理解对象复制行为的关键概念,尤其在涉及动态内存或资源管理时。它们的区别直接影响程序的稳定性与正确性。当你使用拷贝构造函数或赋值操作符时,如果不特别处理,默认情况下会进行浅拷贝,这可能导致多个对象共享同一块内存,从而引发崩溃或数据错误。
浅拷贝是指只复制对象中的成员变量值,对于指针类型,仅复制指针本身(即地址),而不复制它所指向的数据。这意味着两个对象的指针将指向同一块堆内存。
例如:
class String {
private:
char* data;
public:
String(const char* str) {
data = new char[strlen(str) + 1];
strcpy(data, str);
}
<pre class='brush:php;toolbar:false;'>// 默认拷贝构造函数执行的是浅拷贝
// String(const String& other) { data = other.data; } // 危险!};
立即学习“C++免费学习笔记(深入)”;
如果未定义拷贝构造函数,编译器生成的默认版本会直接复制data指针。当两个String对象析构时,都会调用delete[] data;,导致同一块内存被释放两次,程序崩溃。
深拷贝会为新对象分配新的内存空间,并把原对象的数据完整复制过去,确保两个对象完全独立。
正确的做法是自定义拷贝构造函数:
String(const String& other) {
if (other.data) {
data = new char[strlen(other.data) + 1];
strcpy(data, other.data);
} else {
data = nullptr;
}
}
这样每个对象都有自己的内存副本,析构时互不影响。这是实现“值语义”的关键。
当你类中包含以下情况时,必须手动实现深拷贝:
同时,遵循“三大法则”:如果需要析构函数、拷贝构造函数、拷贝赋值操作符中的任意一个,通常三个都需要自己定义。
拷贝构造函数是一种特殊的构造函数,用于从已存在的对象创建新对象:
ClassName(const ClassName& other);
它会在以下场景被调用:
String s2 = s1;
记得加上const引用,避免意外修改原对象,也支持常量对象的拷贝。
基本上就这些。掌握深拷贝和浅拷贝的区别,能帮你写出更安全的C++代码。不复杂但容易忽略。
以上就是c++++ 深拷贝和浅拷贝 c++拷贝构造函数教程的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号