news 2026/7/30 1:35:38

C++ 拷贝构造 拷贝赋值 到底在干什么?——从对象出生到 RAII 思想

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 拷贝构造 拷贝赋值 到底在干什么?——从对象出生到 RAII 思想

很多初学 C++ 的人,在学习到“拷贝构造函数”和“拷贝赋值运算符”时都会产生一个疑问:

这两个东西到底有什么意义?
为什么要分两种?
Java 里也没这么复杂啊?

如果只是记语法,很快就会忘。
真正理解它们,必须从对象生命周期 + 资源所有权这个角度来看。

一、先说结论(一句话版)

  • 拷贝构造:定义“新对象如何复制资源”

  • 拷贝赋值:定义“已有对象如何安全替换资源”

它们的存在,是为了防止:

  • 内存泄漏
  • 双重释放
  • 野指针
  • 资源混乱

二、什么叫对象的“出生”和“换内容”

在 C++ 中,对象有三个关键动作:

行为示例代码调用函数
出生Student a;默认构造函数
用别人出生Student b = a;拷贝构造
已出生再换内容b = a;拷贝赋值

区别的关键只有一个:

左边这个对象,在执行时是否已经存在。

三、为什么要区分这两种?

如果类里只有int / float / bool这种基础类型:

class A { int x; };

你几乎感觉不到区别,因为编译器自动生成的函数足够安全。

但一旦类里出现“资源”,问题就来了。

四、什么是“资源”?

资源不只是内存,包括:

  • new出来的堆内存
  • 文件句柄
  • socket
  • 线程锁
  • OpenGL / GPU 资源
  • JNI 句柄
  • Binder 句柄
  • 数据库连接

这些统称为:资源句柄(Resource Handle)

五、一个真实会炸的例子

class Student { public: char* name; };
Student a("Tom"); Student b = a;

如果你没有写拷贝构造,默认行为是“浅拷贝”:

a.name --> 0x1000 b.name --> 0x1000

两个对象指向同一块内存。

当析构时:

delete a.name; delete b.name; // 💥 双重释放,程序崩溃

六、拷贝构造的意义

拷贝构造的作用是:

创建新对象时,决定是“共享资源”还是“深拷贝资源”。

正确深拷贝后:

a.name --> 0x1000 b.name --> 0x2000

每个对象有自己的一份资源。

七、拷贝赋值的意义

Student a("Tom"); Student b("Jack"); b = a;

如果没有写operator=

b.name 原来指向 0x3000 直接变为 0x1000 0x3000 永远丢失 → 内存泄漏

正确流程应该是:

  1. 判断自赋值
  2. 释放旧资源
  3. 深拷贝新资源
  4. 返回自身引用

八、为什么不能只用一个函数?

因为两种场景的“内存状态”不同:

场景对象是否存在是否需要清理旧资源
拷贝构造不存在不需要
拷贝赋值已存在必须清理

这就是为什么 C++ 必须拆成两个函数。

九、这就引出了 RAII 思想

RAII 全称:

Resource Acquisition Is Initialization
资源获取即初始化

核心思想:

  • 对象出生 → 获取资源
  • 对象复制 → 定义资源复制规则
  • 对象替换 → 定义资源替换规则
  • 对象死亡 → 释放资源

也就是:

资源的生命周期 = 对象的生命周期

十、为什么 Java 没有这些概念?

因为:

JavaC++
GC 自动回收手动管理
引用语义值语义 + 所有权
没析构析构至关重要

在 C++ 中:

你就是 GC,你就是内存管理员。

十一、工程级总结

函数真正意义
拷贝构造新对象如何拥有资源
拷贝赋值已有对象如何替换资源
析构函数对象死亡如何释放资源
三者合一

RAII 生命周期模型

十二、可以记住的一句话

构造是出生,赋值是换脑子,析构是死亡。
三者合在一起,构成 C++ 的资源生命周期管理体系。

当你理解这一点时,
你就从“语法学习者”进入了“对象模型工程师”的阶段。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/26 14:47:08

金属检测机的核心原理与技术指标解析

放在现代工业生产里,金属检测机是质量控制设备里不能少的,它核心的原理是基于电磁感应技术。产品含有金属异物,通过检测区域时,会让交变磁场有扰动,设备内部接收线圈捕捉信号变化,经过电路分析处理&#xf…

作者头像 李华
网站建设 2026/7/26 13:34:45

智慧城市、能源等优质学术会议分享!

​ ↑↑↑ 了解更多详细会议信息、投稿优惠 请添加会议老师 2026年可持续发展与城市规划国际学术会议(SDUP 2026) 2026 International Conference on Sustainable Development and Urban Planning ​ ↑↑↑ 了解更多详细会议信息、投稿优惠 请添…

作者头像 李华
网站建设 2026/7/26 10:16:15

一张图看懂网络空间安全:从网络层到应用层的“防护圈”都有哪些?

什么是网络安全,网络空间安全有哪些安全? 本文章详细列举出网络空间安全的十六大种类 网络空间安全是一个覆盖 “物理层 - 网络层 - 应用层 - 数据层 - 业务层” 的全域防护体系,其安全种类可根据防护对象、技术场景和业务领域划分为 16 大…

作者头像 李华
网站建设 2026/7/26 20:17:09

如何从Target平台获取搜索列表数据的API接口

在现代Web开发中,API(应用程序接口)是实现平台数据交互的核心工具。本文将以Target平台为例,详细介绍如何通过其API接口获取搜索列表数据。Target平台提供了一个RESTful API,允许开发者查询关键词相关的搜索结果&#…

作者头像 李华