news 2026/5/11 21:08:21

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/5/9 15:26:13

一文读懂技术架构、数据架构等六大架构:定义、区别与联系

在信息技术飞速发展的当下,“架构”已成为系统设计与企业数字化转型中的核心词汇。 从企业战略落地到具体产品开发,从数据管理到项目执行,不同维度的架构扮演着“蓝图”角色,指引着系统建设的方向。但很多人容易混淆技术架构、数据架构、业务架构、应用架构、产品架构和项…

作者头像 李华
网站建设 2026/5/9 23:47:23

第八届传智杯UI设计挑战赛练习题库(一)

1.[单选] 在AIGC参与的UI设计挑战赛中,以下哪种视觉元素常用于表示可点击? ( 1分 ) 得分:0分 下划线文本未选 灰色图标 细线条 淡色背景 正确答案下划线文本 答案解析下划线文本在用户认知中常与可点击链接相关&a…

作者头像 李华