随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万

C++复制控制

1、复制控制包括:copy构造,copy赋值,析构方法。

2、没有声明任何构造方法,编译器自动生成一个default构造方法。对于copy构造,copy赋值和析构方法,没有声明,编译器会自动合成一个。

3、合成的copy构造,做的事情是:逐个字段初始化,将新对象初始化为原对象的一个副本。所谓的逐个成员初始化,只是指实例字段,不包括static字段,因为static字段是共享的。如果字段是值类型,直接赋值。如果字段是类类型,递归调用copy构造方法。有个情况很例外,一般情况下,不能复制数组,但是对于类中的数组,合成copy构造将复制数组中的每一个元素。

4、合成的copy赋值,做的事情:除了static字段,逐个字段赋值。

5、那么问题来了,考虑类中的指针,指针的初始化和赋值,只是copy地址,并不copy指向的内容。也就是说,两个指针指向同一块内存,这往往不是程序员所期望的。

6、对于指针的copy,分为三种情况:

  a、简单copy指针,浅复制,两个指针指向同一块地址。优点是:节约内存。缺点是:两个指针指向同一块内存,其中一个修改指向的内容,另外一个也受到影响。如果一个指针执行delete,另外一个指针就变成了野指针。

  b、使用智能指针shared_ptr,共享同一块内存,但是能够防止出现野指针。

  c、深复制,对指向的内容做一个副本,这样的话,两个指针指向的内容互不影响。string就是这样的一个类。

7、因此,对于包含指针的类,也就是资源管理类,要仔细思考,应该怎么样copy,是浅复制还是深复制?

8、复制控制三法则:如果需要析构方法,则同时需要copy构造和copy赋值。思考,为什么?

  用户自定义析构方法,说明要释放资源,也就是有指针。对于指针,合成的copy构造和copy赋值,是浅复制。这往往不是程序员期望的结果,程序员往往期望深复制,因此需要自定义copy构造和copy赋值,执行深复制。

posted on   Andy Niu  阅读(748)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示