首页 > 后端开发 > C++ > 正文

c++ 深拷贝和浅拷贝 c++拷贝构造函数教程

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

c++ 深拷贝和浅拷贝 c++拷贝构造函数教程

在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;,导致同一块内存被释放两次,程序崩溃。

什么是深拷贝?

深拷贝会为新对象分配新的内存空间,并把原对象的数据完整复制过去,确保两个对象完全独立。

正确的做法是自定义拷贝构造函数:

速创猫AI简历
速创猫AI简历

一键生成高质量简历

速创猫AI简历 291
查看详情 速创猫AI简历
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++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号