Matlab有两种基本种类®对象 - 处理和值。
价值对象行为与Matlab基本类型相对于复制操作。副本是独立的值。您在一个对象上执行的操作不会影响该对象的副本。
处理对象由其处理变量引用。句柄变量的副本是指相同的对象。您在句柄对象上执行的操作是从引用该对象引用的所有句柄变量中看到的。
如果您正在定义类并希望支持Hander对象副本,请参阅万博1manbetx为处理类实施副本。
MATLAB数字变量是值对象。例如,当您复制时一个
到变量B.
,两个变量彼此独立。改变价值一个
不改变价值B.
:
a = 8;b = a;
现在重新分配一个
。B.
没有变化:
a = 6;B.
B = 8.
清算一个
不影响B.
:
清除一个B.
B = 8.
作为值对象中的属性存储的值的复制行为与数字变量相同。例如,假设VOBJ1.
是具有属性的值对象一个
:
vobj1.a = 8;
如果你复制VOBJ1.
到VOBJ2.
,然后改变价值VOBJ1.
财产一个
,复制对象属性的值,VOBJ2.A.
,不受影响:
VOBJ2 = VOBJ1;vobj1.a = 5;VOBJ2.A.
ans = 8.
这是一个名为句柄类HDClass.
定义一个名为的属性数据
。
Classdef.HDClass <句柄特性数据结尾方法功能obj = hdclass(val)如果nargin> 0 obj.data = val;结尾结尾结尾结尾
创建此类的对象:
HOBJ1 = HDCLASS(8)
由于此语句未与分号终止,因此MATLAB显示有关对象的信息:
HOBJ1 =具有属性的HDCLASS:数据:8
变量HOBJ1.
是引用创建的对象的句柄。复制HOBJ1.
到HOBJ2.
导致另一个句柄引用相同的对象:
hobj2 = hobj1.
HOBJ2 = HYCCLASS具有属性:数据:8
由于句柄引用对象,复制句柄将句柄复制到新的变量名称,但句柄仍然是指同一个对象。例如,鉴于这一点HOBJ1.
是带有财产的句柄对象数据
:
hobj1.data.
ans = 8.
改变价值HOBJ1.
s数据
属性和复制对象的值数据
财产也更改:
hobj1.data = 5;hobj2.data.
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仅修改功能工作空间中的对象的副本。句柄和值类之间的复制行为的差异在这种情况下很重要:
值对象 - 函数必须返回对象的修改后副本。要在调用者的工作空间中修改对象,请将函数输出分配给相同名称的变量
处理对象 - 函数工作区中的副本是指相同的对象。因此,该函数不必返回修改后的副本。
要确定对象是否是句柄对象,请使用isa.
功能。如果obj.
是某些类的对象,此语句确定是否obj.
是一个句柄:
isa(obj,'处理')
例如,容器.map.
类创建一个句柄对象:
hobj = containers.map({'红袜队'那'洋基队'},{'波士顿'那'纽约'});isa(霍布夫,'处理')
ans = 1
霍布尔
也是A.容器.map.
目的:
ISA(Hobj,'containers.map')
ans = 1
查询课程霍布尔
表明它是一个容器.map.
目的:
班级(霍布夫)
ANS =容器.MAP.
这班级
函数返回对象的特定类。