主要内容

对象行为

两个复制行为

MATLAB有两种基本种类®对象 - 处理和值。

价值对象的行为就像MATLAB基本类型相对于复制操作。副本是独立的值。您在一个对象上执行的操作不会影响该对象的副本。

处理对象由其句柄变量引用。句柄变量的副本是指同一对象。从引用该对象的所有句柄变量中可以看到您在手柄对象上执行的操作。

处理对象副本

如果您要定义类并要支持处理对象副本,请参见万博1manbetx实施手柄类

价值对象复制行为

MATLAB数字变量是值对象。例如,当您复制时一个到变量b,两个变量彼此独立。改变价值一个不改变价值b

a = 8;b = a;

现在重新分配一个b不变:

a = 6;b
b = 8

清理一个不影响b

清除一个b
b = 8

值对象属性

值存储为值对象中属性的值的复制行为与数字变量相同。例如,假设VOBJ1是带有属性的值对象一个

vobj1.a = 8;

如果您复制VOBJ1VOBJ2,然后更改价值VOBJ1财产一个,复制对象属性的价值,vobj2.a,不受影响:

vobj2 = vobj1;vobj1.a = 5;vobj2.a
ANS = 8

处理对象复制行为

这是一个称为的句柄课程HDClass定义一个称为的属性数据

ClassDefHDClass 特性数据结尾方法功能obj = hdclass(val)如果nargin> 0 obj.data = val;结尾结尾结尾结尾

创建此类的对象:

hobj1 = hdclass(8)

由于此语句未用半元素终止,因此MATLAB显示有关该对象的信息:

hobj1 =具有属性的HDClass:数据:8

变量HOBJ1是引用创建对象的句柄。复制HOBJ1HOBJ2导致另一个涉及相同对象的句柄:

hobj2 = hobj1
hobj2 =具有属性的HDClass:数据:8

由于处理对象的引用,因此复制句柄将句柄复制到新的变量名称,但该手柄仍然引用同一对象。例如,鉴于HOBJ1是带有属性的句柄对象数据

hobj1.data
ANS = 8

改变HOBJ1'数据属性和复制对象的价值数据属性也会改变:

hobj1.data = 5;hobj2.data
ANS = 5

因为HOBJ2HOBJ1是同一对象的处理,更改副本,HOBJ2,还更改您通过句柄访问的数据HOBJ1

hobj2.data = 17;hobj1.data
ANS = 17

重新分配手柄变量

重新分配手柄变量与重新分配任何MATLAB变量相同。当您创建对象并将其分配给HOBJ1

HOBJ1 = HDCLASS(3.14);

HOBJ1引用新对象,而不是前面引用的相同对象(仍然引用HOBJ2)。

清除手柄变量

当您从工作区清除手柄时,MATLAB卸下了变量,但不会删除另一个手柄引用的对象。但是,如果没有对对象的引用,则MATLAB会破坏对象。

给出HOBJ1HOBJ2,两者都引用相同的对象,您可以清除要么在不影响对象的情况下进行处理:

hobj1.data = 2^8;清晰的HOBJ1 HOBJ2
hobj2 =具有属性的HDClass:数据:256

如果你们俩都清除了HOBJ1HOBJ2,然后没有对对象的引用。MATLAB破坏对象并释放该对象使用的内存。

删除手柄对象

要删除任何数量的手柄引用的对象,请使用删除。给出HOBJ1HOBJ2,两者都指的是同一对象,请删除任何一个句柄。MATLAB删除对象:

hobj1 = hdclass(8);hobj2 = hobj1;删除(hobj1)hobj2
hobj2 =删除的HDClass

利用清除从工作区中删除变量。

修改对象

当您将对象传递给函数时,MATLAB将对象的副本传递到函数工作区。如果函数修改对象,则MATLAB仅修改函数工作区中对象的副本。在这种情况下,手柄和价值类之间的复制行为差异很重要:

  • 值对象 - 该函数必须返回对象的修改副本。要修改呼叫者工作区中的对象,请将函数输出分配给同名的变量

  • 处理对象 - 函数工作空间中的副本是指同一对象。因此,该函数不必返回修改后的副本。

测试手柄或价值类

要确定对象是否是句柄对象,请使用伊萨功能。如果OBJ是某些类的对象,此语句确定是否OBJ是一个句柄:

isa(obj,'处理'

例如,containser.map类创建一个句柄对象:

hobj = contains.map({{“红袜”,,,,'洋基'},{“波士顿”,,,,'纽约'});伊萨(霍布,'处理'
ans = 1

霍布也是一个containser.map目的:

isa(Hobj,'containser.map')
ans = 1

查询班级霍布表明这是一个containser.map目的:

班级(HOBJ)
ans = contains.map

班级函数返回对象的特定类。

相关话题