复制对象
两种复制行为
有两种基本的MATLAB®对象——句柄和值。
价值对象在复制操作方面的行为类似于MATLAB基本类型。副本是独立的值。对一个对象执行的操作不会影响该对象的副本。
处理对象由它们的句柄变量引用。句柄变量的副本引用同一个对象。对句柄对象执行的操作在引用该对象的所有句柄变量中都是可见的。
处理对象副本
如果您正在定义类并希望支持句柄对象复制,请参见实现句柄类的Copy.
值对象复制行为
MATLAB数值变量是值对象。例如,当你复制一个
对该变量b
,两个变量是相互独立的。更改的值一个
的值不改变b
:
= 8;b =一个;
现在重新分配一个
.b
是不变的:
= 6;b
b = 8
清算一个
不影响b
:
清晰的一个b
b = 8
对象属性值
在值对象中作为属性存储的值的复制行为与数值变量相同。例如,假设vobj1
值对象是否具有属性一个
:
vobj1。= 8;
如果你复制vobj1
来vobj2
,然后更改的值vobj1
财产一个
,复制对象的属性值,vobj2.a
影响:
vobj2 = vobj1;vobj1。一个= 5; vobj2.a
ans = 8
处理对象复制行为
这里有一个句柄类叫做HdClass
它定义了一个名为数据
.
classdefHdClass <处理属性数据结束方法函数obj = HdClass (val)如果Nargin > 0 obj。数据= val;结束结束结束结束
创建该类的一个对象:
hobj1 = HdClass (8)
因为这个语句没有以分号结尾,所以MATLAB会显示关于对象的信息:
hobj1 = HdClass属性:Data: 8
的变量hobj1
是引用所创建对象的句柄。复制hobj1
来hobj2
导致另一个句柄引用相同的对象:
hobj2 = hobj1
hobj2 = HdClass属性:Data: 8
因为句柄引用对象,复制句柄将句柄复制到一个新的变量名,但句柄仍然引用相同的对象。举个例子hobj1
句柄对象是否具有属性数据
:
hobj1。数据
ans = 8
更改的值hobj1
的数据
属性的值和复制对象的数据
财产也在改变:
hobj1。数据= 5; hobj2.Data
ans = 5
因为hobj2
而且hobj1
是同一对象的句柄,改变副本,hobj2
,也会更改您通过句柄访问的数据hobj1
:
hobj2。数据= 17; hobj1.Data
ans = 17
重新分配处理变量
重赋句柄变量的结果与重赋任何MATLAB变量的结果相同。当您创建一个对象并将其赋值给hobj1
:
hobj1 = HdClass (3.14);
hobj1
引用新对象,而不是先前引用的同一对象(仍然由hobj2
).
清算处理变量
当您从工作空间清除句柄时,MATLAB将删除该变量,但不删除其他句柄引用的对象。但是,如果没有对对象的引用,MATLAB就会销毁该对象。
鉴于hobj1
而且hobj2
,它们都引用相同的对象,你可以清除任何句柄而不影响对象:
hobj1。数据= 2^8; clear hobj1 hobj2
hobj2 =带有属性的HdClass: Data: 256
如果两者都清除hobj1
而且hobj2
,则没有对对象的引用。MATLAB销毁对象并释放该对象使用的内存。
删除处理对象
若要删除由任意数量句柄引用的对象,请使用删除
.鉴于hobj1
而且hobj2
,它们都引用同一个对象,删除其中一个句柄。MATLAB删除对象:
hobj1 = HdClass (8);hobj2 = hobj1;删除(hobj1) hobj2
hobj2 =删除HdClass的句柄
使用清晰的
从工作区中删除该变量。
修改对象
当您将一个对象传递给一个函数时,MATLAB将该对象的副本传递到函数工作区。如果函数修改对象,MATLAB只修改函数工作区中对象的副本。句柄类和值类之间拷贝行为的差异在这种情况下很重要:
Value object -函数必须返回对象的修改副本。要修改调用者工作区中的对象,请将函数输出分配给同名的变量
句柄对象——函数工作区中的副本引用相同的对象。因此,函数不必返回修改后的副本。
测试句柄或值类
要确定对象是否是句柄对象,请使用isa
函数。如果obj
是某个类的对象,此语句确定ifobj
是一个处理:
isa (obj,“处理”)
例如,容器。地图
类创建一个句柄对象:
hobj =容器。地图({“红袜队”,“洋基}, {“波士顿”,“纽约”});isa (hobj“处理”)
ans = 1
hobj
也是一个容器。地图
对象:
isa (hobj containers.Map)
ans = 1
查询的类hobj
表明它是一个容器。地图
对象:
类(hobj)
ans =容器。地图
的类
函数返回对象的特定类。