主要内容

句柄类和值类的比较

基本区别

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

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

所有句柄类都是从抽象派生的处理类。

创建一个值类

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

classdefMyValueClass...结束

创建句柄类

要创建处理类的派生类处理类。

classdefMyHandleClass < handle...结束

的行为MATLAB内置类

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

A = int32(7);B = a;A = A ^4;
b 7

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

X = 1:10;Y = sinx;L1 =直线(x,y);L2 = l1;

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

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

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

删除(l2)集(l1,“颜色”“蓝”
使用matlab.graphics.primitive时出错。Line/set无效或删除对象。

如果通过删除任何一个现有句柄来删除该对象,则所有副本现在都无效,因为您删除了所有句柄引用的单个对象。

删除句柄对象与清除句柄变量不同。在图形对象层次结构中,对象的父对象保存着对该对象的引用。例如,父轴保存对被引用的行对象的引用l1而且l2.如果从工作空间中清除这两个变量,则对象仍然存在。

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

用户定义的值类

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

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

价值对象行为

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

classdefNumValue属性Number = 1结束结束

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

a = NumValue
a = NumValue,属性:Number: 1

赋值为一个对另一个变量,b

B = a
b = NumValue,带有属性:Number: 1

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

a.Number = 7
a = NumValue,属性:Number: 7
b
b = NumValue,带有属性:Number: 1

修改函数中的值对象

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

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

自定义句柄类

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

处理对象行为

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

classdefNumHandle < handle属性Number = 1结束结束

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

a = NumHandle
a = NumHandle,属性:Number: 1

赋值为一个对另一个变量,b

B = a
b =带有属性的NumHandle: Number: 1

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

a.Number = 7
a = NumHandle,属性:Number: 7
b
b = NumHandle,属性:Number: 7

修改函数中的句柄对象

将句柄对象传递给函数时,MATLAB会在函数工作区中创建句柄的副本。由于句柄的副本引用相同的底层对象,因此修改句柄对象的函数也会有效地修改调用者工作区中的对象。因此,修改处理作为输入参数传递的对象的函数没有必要将修改后的对象返回给调用者。

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

删除处理

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

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

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

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

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

确定对象的相等性

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

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

价值对象的相等性

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

a = NumValue;b = NumValue;isequal (a, b)
Ans = 1

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

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

a = NumValue;b = NumValue;b.数字= 7;isequal (a, b)
Ans = 0

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

句柄对象的相等性

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

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

  • 句柄引用具有相同值的同一类的对象,但不是相同的对象isequal返回真正的

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

a = NumHandle;B = a;

使用相等性检验= =而且isequal

A == b
Ans = 1
isequal (a, b)
Ans = 1

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

a = NumHandle;b = NumHandle;

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

A == b
Ans = 0

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

isequal (a, b)
Ans = 1

句柄类支持的功能金宝app

处理类使你的类:

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

相关的话题