主要内容

句柄类和值类的比较

基本区别

一个价值类构造函数返回一个与被赋值的变量相关联的对象。如果你重新分配这个变量,MATLAB®创建原始对象的独立副本。如果将此变量传递给函数以修改它,则函数必须将修改后的对象作为输出参数返回。有关价值型行为的信息,请参见避免不必要的数据拷贝

一个处理类构造函数返回一个句柄对象,该句柄对象是对所创建对象的引用。您可以将句柄对象赋值给多个变量,或将其传递给函数,而无需MATLAB复制原始对象。修改作为输入参数传递的句柄对象的函数不需要返回该对象。

所有句柄类都派生自抽象处理类。

创建值类

默认情况下,MATLAB类是值类。下面的定义创建了一个名为MyValueClass

classdefMyValueClass...结束

创建句柄类

创建一个处理类中派生类处理类。

classdefMyHandleClass <处理...结束

的行为MATLAB内置类

MATLAB的基本类是值类(数值类,逻辑字符细胞结构体,函数句柄)。例如,如果你创建一个类的对象int32并复制这个对象,结果是两个独立的对象。当你改变的值一个的价值b不会改变。这种行为是代表值的类的典型行为。

一个= int32 (7);b =一个;= ^ 4;
b 7

MATLAB图形对象被实现为句柄对象,因为它们代表视觉元素。例如,创建一个图形线对象并将其句柄复制到另一个变量。两个变量都指向同一个直线对象。

x = 1:10;y = sin (x);l1 =线(x, y);l2 = l1;

使用句柄的任意一个副本设置行对象的属性。

集(l2,“颜色”“红色”)设置(l1,“颜色”“绿色”
get (l2,“颜色”
Ans = 0 0

调用删除功能上的l2句柄销毁行对象。如果您试图设置颜色在线属性l1,函数返回错误。

删除(l2)集(l1,“颜色”“蓝”
使用matlab.graphics.primitive错误。无效或已删除的对象。

如果通过删除任何一个现有句柄来删除对象,那么所有的副本现在都是无效的,因为您删除了所有句柄指向的单个对象。

删除句柄对象与清除句柄变量不同。在图形对象层次结构中,对象的父对象保存对该对象的引用。例如,父轴持有对被引用的线对象的引用l1l2.如果从工作区中清除这两个变量,对象仍然存在。

有关句柄对象行为的更多信息,请参见处理对象的行为

用户定义的值类

MATLAB将值类的对象与赋值对象的变量关联起来。当您将值对象复制到另一个变量或将值对象传递给函数时,MATLAB将创建该对象和该对象包含的所有数据的独立副本。新对象独立于对原始对象的更改。值对象的行为类似于MATLAB的数值和结构体类。每个属性本质上就像一个MATLAB数组。

值对象总是与一个工作区或临时变量相关联。当值对象的变量超出作用域或被清除时,值对象将超出作用域。没有对值对象的引用,只有独立对象的副本。

值对象的行为

下面是一个值类,它将一个值存储在数量财产。默认的属性值是数字1

classdefNumValue属性数量= 1结束结束

创建一个NumValue对象赋给变量一个

一个= NumValue
a = NumValue属性:Number: 1

赋值一个另一个变量,b

b =一个
b = NumValue属性:Number: 1

的变量一个b是独立的。的值数量的属性一个不影响数量的属性b

a.Number = 7
a = NumValue属性:Number: 7
b
b = NumValue属性:Number: 1

修改函数中的值对象

当您将一个值对象传递给一个函数时,MATLAB会在函数工作区中创建该对象的副本。因为值对象的副本是独立的,所以函数不会在调用者的工作空间中修改对象。因此,修改值对象的函数必须返回修改后的对象,以便在调用者的工作空间中重新分配。

有关更多信息,请参见对象修改

用户定义的处理类

类派生的类的实例处理类是对基础对象数据的引用。当复制句柄对象时,MATLAB会复制句柄,但不会复制存储在对象属性中的数据。副本引用与原始句柄相同的对象。如果更改原始对象的属性值,复制的句柄将引用相同的更改。

处理对象的行为

下面是一个句柄类,它将一个值存储在数量财产。默认的属性值是数字1

classdefNumHandle <处理属性数量= 1结束结束

创建一个NumHandle赋给变量的对象一个

一个= NumHandle
a = NumHandle的属性

赋值一个另一个变量,b

b =一个
b = NumHandle属性:Number: 1

的变量一个b引用相同的底层对象。的值数量的属性一个也改变了数量的属性b.也就是说,一个b引用同一个对象。

a.Number = 7
a = NumHandle属性:Number: 7
b
b = NumHandle带有属性:Number: 7

修改函数中的句柄对象

当您将句柄对象传递给函数时,MATLAB会在函数工作区中创建句柄的副本。因为句柄的副本引用相同的基础对象,所以修改句柄对象的函数实际上也在调用者的工作空间中修改对象。因此,对于作为输入参数传递的修改句柄对象的函数来说,没有必要将修改后的对象返回给调用者。

有关更多信息,请参见对象修改

删除处理

您可以通过显式调用句柄来销毁句柄对象删除方法。删除句柄类对象的句柄会导致所有句柄无效。例如:

一个= NumHandle;b =一个;删除(a) b.Number
无效或已删除的对象。

调用删除在句柄对象上调用析构函数或该对象的函数。看到处理类的析构函数为更多的信息。

初始化属性以包含句柄对象

有关在属性块中将属性初始化为默认值与从构造函数中初始化属性之间的区别,请参见初始化属性值初始化句柄对象数组

确定对象的相等性

值对象的相等意味着对象属于相同的类并具有相同的状态。

句柄对象的相等意味着句柄变量引用同一个对象。您还可以标识引用同一类中具有相同状态的不同对象的句柄变量。

值对象相等

要确定值对象是否具有相同的大小以及它们的内容是否具有相同的值,请使用isequal.例如,使用前面定义的NumValue类创建两个实例并测试是否相等:

一个= NumValue;b = NumValue;isequal (a, b)
ans = 1

一个b是独立的,因此不是同一对象。然而,每个代表相同的值。

如果更改值对象表示的值,则这些对象不再相等。

一个= NumValue;b = NumValue;b.Number = 7;isequal (a, b)
ans = 0

值类没有默认值情商方法来实现==操作。

句柄对象的相等性

处理对象继承情商方法从处理基类。您可以使用==isequal要测试句柄对象之间的两种不同关系:

  • 句柄指向同一个对象:==isequal返回真正的

  • 句柄指的是具有相同值的同一类的对象,但不是相同的对象(仅限)isequal返回真正的

使用前面定义的NumHandle类创建对象并复制句柄。

一个= NumHandle;b =一个;

使用==isequal

a = =
ans = 1
isequal (a, b)
ans = 1

的两个实例NumHandle使用默认值初始化。

一个= NumHandle;b = NumHandle;

确定一个b引用同一个对象。

a = =
ans = 0

确定一个b有相同的价值。

isequal (a, b)
ans = 1

句柄类支持的功能金宝app

派生的处理类使你的类能够:

看到处理的超类有关句柄类及其方法的更多信息。

相关的话题