当前位置: 首页 > news >正文

Cangjie 中的值类型与引用类型

1. 值类型和引用类型
1.1 值的存储方式

所有变量在底层实现中,都会关联一个具体的“值”,这个值可能存储在 内存地址 或 寄存器 中。

  • 寄存器用于优化常用变量的访问速度。
  • 只有局部、小、频繁使用的变量才更可能被分配到寄存器中。
  • 实际行为由编译器根据上下文和优化策略决定。

对于值变量而言,这个关联的值本身就是数据的直接表示。例如,一个 Int64 类型的变量 let x = 5 ,其关联的值 5 直接存储在变量的内存空间中,而非指向其他位置。

对于引用变量而言,其关联的值是一个对对象的引用,该引用通常表现为对象在堆内存中的地址。变量本身并不包含对象的实际数据,而是通过这个引用间接访问对象的内容。

在 Cangjie 语言中,class 和 Array / ArrayList / HashMap 等 collection 类型 属于引用类型,struct 和 Int64 / String 等 基础类型 属于值类型。

1.2 let 在值类型与引用类型中的行为差异

引用类型 和 值类型 这种分类,直接影响了变量声明(varlet)与方法调用的规则。

“let 与 var,分别对应不可变和可变属性,可变性决定了变量被初始化后其值还能否改变,仓颉变量也由此分为不可变变量和可变变量两类。”

  • 值类型特性:struct 实例的变量在声明为 let 时是完全不可变的,包括其内部的字段;若需修改 struct 实例的状态,则需使用 var 声明变量,var d = Data()

在这里插入图片描述

  • 引用类型特性:引用类型实例的变量是引用(类似指针),let 声明仅禁止重新赋值引用本身,但允许通过引用修改对象内部状态。

在这里插入图片描述

let struct 与 let class 类似于 C++ 中常量指针常量(const T * const)和指针常量(T * const)的区别 —— 前者指向、指向的内容均不可变,后者指向不可变、指向的内容可变。

2. 复制和传参的机制
2.1 复制行为解析

值类型变量的赋值或传参会触发深拷贝,即完整复制变量的相关数据,原始实例与副本状态隔离;

引用类型变量的复制或传参会复制引用(而非对象本身)。

Cangjie 值类型(struct)和引用类型(class)的复制均不会触发构造函数:

  • struct 在赋值或传参时,直接复制内存数据,不会调用构造函数、重新初始化成员变量。

在这里插入图片描述

let d2= d1 的行为并不会调用 init(D: Data) 构造函数。因为 Cangjie 中结构体(struct)是值类型,赋值操作会直接复制内存中的数据,而不是通过构造函数进行初始化。
·
如果 Cangjie 在赋值时真的使用了自定义的拷贝构造函数(如 init(D: Data)),则会导致无限递归的问题:因为拷贝构造函数本身在初始化新对象时又会触发一次赋值,进而再次调用拷贝构造函数,形成循环。
·
因此,这种“反向验证”说明 Cangjie 在底层对值类型的赋值操作采用的是直接内存复制的方式,而不是依赖用户定义的构造函数。

  • class 的实例通过引用来共享数据,赋值或传参仅复制引用地址,无需构造新对象。
2.2 值类型中嵌套引用类型

当值类型(如 struct)中包含引用类型(如 ArrayList / class )时,复制值类型会导致以下行为:

  • 值类型字段:直接复制数据。修改副本的值类型字段,不影响原始实例。
  • 引用类型字段:复制引用地址。副本的引用类型字段与原始实例共享同一对象。

http://www.xdnf.cn/news/716905.html

相关文章:

  • 设置变体控制两个apk, 一个是有密码,一个是没有密码!
  • 英语写作中“广泛、深入、详细地(的)”extensively、in-depth、at length (comprehensive )的用法
  • 46. Permutations和47. Permutations II
  • Spring Event(事件驱动机制)
  • 力扣面试150题--二叉树的右视图
  • leetcode hot100刷题日记——27.对称二叉树
  • ubuntu系统上运行jar程序输出时间时区不对
  • C#实现单实例应用程序:确保程序唯一运行实例
  • 算法第32天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • 构筑电网“无形防线”: 防外破告警在线监测服务系统
  • 如何批量给局域网内网里的电脑发送信息
  • STM32 HAL库函数学习 GPIO篇
  • 【Redis】RDB和AOF混合使用
  • Java求职面试:从核心技术到AI与大数据的全面考核
  • 网络编程之网络编程预备知识
  • Python对接GPT-4o API接口:聊天与文件上传功能详解
  • 人工智能浪潮下,制造企业如何借力DeepSeek实现数字化转型?
  • cutlass学习教程
  • Security
  • Coze Space的分享体验:基于Y模型分析法的深入剖析
  • 交通违法拍照数据集,可识别接打电话,不系安全带的行为,支持YOLO,COCO JSON,VOC XML格式的标注数据集 最高正确识别率可达88.6%
  • window安装nginx
  • PostgreSQL查询一个表的数据
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月29日第92弹
  • N2语法 逆接
  • Python应用while嵌套循环
  • 嵌入式学习笔记 - freeRTOS 阻塞延时的实现机制,同时避免在中断中扫描停留
  • 2025音频传输模块全球选购指南:高品质音频体验的品牌之选
  • 民锋视角下的资产配置策略优化与风险评估模型探索
  • 华为OD机试真题——字母组合过滤组合字符串(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现