MATLAB handle类构造调用异常、索引赋值及数组长度问题咨询
问题解析
一、三次构造函数调用的原因
d.new()执行时,三次构造调用分别来自三个环节:
- 显式创建实例:
new方法中out = Dog();直接调用无参构造,打印第1次。 - 类型转换:执行
out('bark') = 1时,MATLAB需要将右侧数值1转换为Dog类型,自动调用Dog(1)(构造函数支持varargin,可接受1个参数),打印第2次。 - 数组扩展初始化:由于下标
'bark'对应的ASCII索引最大值为114,MATLAB需将out扩展为1×114的数组,此时调用Dog(1,114)(传入数组维度作为参数)初始化扩展元素,打印第3次。
二、1×114 Dog数组的由来
MATLAB中字符数组作为下标时,会自动转换为对应字符的ASCII码值作为线性索引:
'bark'的四个字符ASCII码分别为:'a'=97、'b'=98、'k'=107、'r'=114。
其中最大索引值为114,因此MATLAB会将数组扩展到能容纳该索引的最小尺寸——1×114。
三、核心机制说明
1. 下标赋值的默认逻辑
执行obj(index) = value时,MATLAB默认行为:
- 类型匹配检查:若
value与obj元素类型不同,调用obj类的构造函数将value转换为目标类型。 - 数组自动扩展:若
index超出当前数组大小,自动扩展数组,扩展部分通过调用构造函数初始化(构造函数支持的参数数量决定调用方式,如无参、传入维度等)。
2. 字符下标的ASCII转换
仅当类重载subsref/subsasgn方法时,字符下标才会按字符串逻辑处理。由于Dog类未重载这两个方法,MATLAB触发默认ASCII转换规则,将每个字符转为索引值。
3. varargin的关键作用
构造函数添加varargin后,支持任意数量的参数输入:
- 无参调用(
Dog()):创建初始实例。 - 单参数调用(
Dog(1)):完成数值到对象的转换。 - 双参数调用(
Dog(1,114)):初始化扩展后的数组。
若移除varargin,构造函数仅支持无参调用,上述后两种场景会因参数数量不匹配报错。
4. 直接执行d('bark') = 1无异常的原因
此时d已是1×1的Dog实例,执行赋值时仅触发类型转换和数组扩展两次构造调用,且不会覆盖原d的引用(除非显式赋值),因此不会出现d.new()中“三次打印+覆盖实例”的复合现象。
内容的提问来源于stack exchange,提问作者OverLordGoldDragon
相关产品推荐
相关产品推荐

