MATLAB有两种基本类型®对象-句柄和值。
价值就复制操作而言,对象的行为类似于MATLAB基本类型。复制是独立的值。对一个对象执行的操作不会影响该对象的复制。
手柄对象由其句柄变量引用。句柄变量的副本引用同一对象。对句柄对象执行的操作可以从引用该对象的所有句柄变量中看到。
如果要定义类并希望支持句柄对象复制,请参见金宝app实现句柄类的复制.
MATLAB数值变量是值对象。例如,当您复制A.
到变量B
,这两个变量彼此独立。更改A.
不会更改的值B
:
a=8;b=a;
现在重新分配A.
.B
保持不变:
a=6;B
b=8
清理A.
不影响B
:
清楚的A.B
b=8
值对象中存储为属性的值的复制行为与数值变量相同vobj1
是具有属性的值对象A.
:
vobj1.a=8;
如果你复制vobj1
到vobj2
,然后更改的值vobj1
所有物A.
,复制对象属性的值,vobj2.a
,不受影响:
vobj2=vobj1;vobj1.a=5;vobj2.a
ans=8
这里有一个句柄类,名为HdClass
它定义了一个名为数据
.
classdefHdClass<句柄性质数据终止方法作用obj=HdClass(val)如果nargin>0对象数据=val;终止终止终止终止
创建此类的对象:
hobj1=HdClass(8)
由于此语句未以分号结尾,因此MATLAB显示有关对象的信息:
hobj1=HdClass,属性:数据:8
变量hobj1
是引用所创建对象的句柄。正在复制hobj1
到hobj2
导致另一个句柄引用同一对象:
hobj2=hobj1
hobj2=HdClass,属性:数据:8
因为句柄引用对象,所以复制句柄会将句柄复制到新的变量名,但句柄仍然引用相同的对象hobj1
是具有属性的句柄对象数据
:
B.数据
ans=8
更改hobj1
的数据
属性和复制对象的数据
属性也会发生变化:
hobj1.数据=5;B.数据
ans=5
因为hobj2
和hobj1
是同一对象的句柄,正在更改副本,hobj2
,还更改通过句柄访问的数据hobj1
:
hobj2.Data=17;hobj1.Data
ans=17
重新指定句柄变量会产生与重新指定任何MATLAB变量相同的结果hobj1
:
hobj1=HdClass(3.14);
hobj1
引用新对象,而不是以前引用的同一对象(仍由引用)hobj2
).
从工作区清除句柄时,MATLAB会删除变量,但不会删除另一个句柄引用的对象。但是,如果没有对象引用,MATLAB会销毁该对象。
鉴于hobj1
和hobj2
,两者都引用同一对象,可以清除任一句柄而不影响对象:
hobj1.Data=2^8;清除hobj1 hobj2
hobj2=HdClass,属性:数据:256
如果你两个都清除了hobj1
和hobj2
,则没有对该对象的引用。MATLAB将销毁该对象并释放该对象使用的内存。
要删除由任意数量的句柄引用的对象,请使用删去
鉴于hobj1
和hobj2
,两者都引用同一对象,请删除任一句柄。MATLAB删除对象:
hobj1=HdClass(8);hobj2=hobj1;删除(hobj1)hobj2
hobj2=已删除HdClass的句柄
使用清楚的
从工作区中删除变量。
将对象传递给函数时,MATLAB会将对象的副本传递到函数工作区。如果函数修改对象,MATLAB只修改函数工作区中对象的副本。在这种情况下,句柄类和值类之间的复制行为差异很重要:
Value object—函数必须返回对象的修改副本。若要修改调用方工作区中的对象,请将函数输出分配给同名变量
句柄对象-函数工作区中的副本引用同一对象。因此,函数不必返回修改后的副本。
要确定对象是否为句柄对象,请使用伊萨
函数。如果obj
是某个类的对象,此语句确定obj
是一个句柄:
isa(obj,“把手”)
例如集装箱。地图
类创建句柄对象:
hobj=containers.Map({“红袜队”,“北方佬”},{“波士顿”,“纽约”});isa(hobj,“把手”)
ans=1
霍布
也是一个集装箱。地图
对象:
isa(hobj,'containers.Map')
ans=1
查询霍布
这表明它是一个集装箱。地图
对象:
班级(hobj)
ans=容器。映射
这个班
函数返回对象的特定类。