首页 >后端开发 >C++ >为什么使用引用类型时向列表添加新值会覆盖以前的值?

为什么使用引用类型时向列表添加新值会覆盖以前的值?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-19 20:40:13582浏览

Why Does Adding a New Value to a List Overwrite Previous Values When Using Reference Types?

理解列表用引用类型覆盖

提供的代码演示了将引用类型与列表一起使用时的常见陷阱。 Tag 类是引用类型,意味着变量保存对对象内存位置的 引用,而不是对象本身的副本。

在循环内,相同的_tag实例被重复修改。列表中的每次添加都不会创建新的 Tag 对象;相反,它添加了对 same _tag 对象的另一个引用。 因此,最终列表包含多个指向 last 修改状态 _tag.

的引用

为什么使用struct可以解决问题

public class Tag 更改为 public struct Tag 可以解决该问题,因为结构是值类型。 当分配一个结构体时,会创建该结构体数据的副本。 因此,循环的每次迭代都会创建一个完全独立的 _tag 实例。对一个实例的修改不会影响其他实例,从而生成一个包含唯一 Tag 对象的列表。

派生集合类相关性

问题并不是 TagCollection 类的设计所固有的。 TagCollection 类本身似乎已正确实现。核心问题在于如何在填充列表的循环中处理 _tag 实例,特别是单个引用类型实例的重复修改。

以上是为什么使用引用类型时向列表添加新值会覆盖以前的值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn