句柄类和值类的比较

基本差异

​        值类构造函数返回一个与其赋值变量相关联的对象。如果对此变量重新赋值,MATLAB® 会创建原始对象的独立副本。如果将此变量传递给函数以修改它,函数必须将修改后的对象以输出参数形式返回。

句柄类构造函数返回句柄对象,该对象是对所创建对象的引用。可以将句柄对象赋给多个变量或将它传递给函数,而不会导致 MATLAB 创建原始对象的副本。函数对作为输入参数传递的句柄对象进行修改后,不必返回该对象。

所有句柄类都派生自抽象的 handle 类。​

创建值类

默认情况下,MATLAB 类是值类。以下定义创建名为 MyValueClass 的值类:

classdef MyValueClass ...end 

创建句柄类

要创建handle类,请从handle类派生该类。

classdef MyHandleClass < handle...end 

MATLAB 内置类的行为

MATLAB 基础类是值类(数值、logical、char、cell、struct 以及函数句柄)。例如,如果创建 int32 类的对象并复制该对象,结果会是两个独立的对象。更改a的值不会导致b的值发生更改。此行为是表示值的类的典型行为。

a = int32(7);
b = a;
a = a^4;b7

MATLAB 图形对象作为句柄对象实现,因为它们表示视觉元素。例如,创建一个图形线条对象,并将它的句柄复制到另一个变量。这两个变量引用同一个线条对象。

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

使用句柄的任一副本设置线条对象的属性。

set(l2,'Color','red')
set(l1,'Color','green')
get(l2,'Color')ans =0     1     0

对 l2 句柄调用 delete 函数会销毁该线条对象。如果尝试在 l1 行设置 Color 属性,set 函数将返回错误。

delete(l2)
set(l1,'Color','blue')Error using matlab.graphics.primitive.Line/set
Invalid or deleted object.

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

删除句柄对象不同于清除句柄变量。在图形对象层次结构中,对象的父级保存对该对象的引用。例如,父坐标区包含对 l1 和 l2 引用的线条对象的引用。如果从工作区中清除这两个变量,该对象仍然存在。

​        有关句柄对象行为的详细信息,可以参考句柄对象行为。

用户定义的值类

MATLAB 将值类的对象与该对象的赋值变量相关联。当将值对象复制到另一个变量或将值对象传递给函数时,MATLAB 会创建该对象和该对象包含的所有数据的独立副本。对原始对象的更改不会影响到新对象。值对象的行为类似于 MATLAB 数值类和 struct 类。每个属性的行为本质上都类似于 MATLAB 数组。

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

值对象行为

以下是一个值类,它在其 Number 属性中存储一个值。默认属性值是数字 1。

classdef NumValuepropertiesNumber = 1end
end

创建一个为变量 a 赋值的 NumValue 对象。

a = NumValue
a = NumValue with properties:Number: 1

将 a 的值赋给另一个变量 b。

b = a
b = NumValue with properties:Number: 1

变量 a 和 b 是独立的。更改 a 的 Number 属性的值不会影响 b 的 Number 属性。

a.Number = 7
a = NumValue with properties:Number: 7
b
b = NumValue with properties:Number: 1

修改函数中的值对象

​        将值对象传递给函数时,MATLAB 会在函数工作区中创建该对象的副本。由于值对象的副本是独立的,因此函数不会修改调用方工作区中的对象。因此,修改值对象的函数必须返回修改后的对象,用以在调用方工作区中重新赋值。具体可以参考对象修改。​

用户定义的句柄类

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

句柄对象行为

以下是一个句柄类,它在 Number 属性中存储一个值。默认属性值是数字 1。

classdef NumHandle < handlepropertiesNumber = 1end
end

创建一个为变量 a 赋值的 NumHandle 对象。

a = NumHandle
a = NumHandle with properties:Number: 1

将 a 的值赋给另一个变量 b。

b = a
b = NumHandle with properties:Number: 1

变量 a 和 b 引用同一底层对象。更改 a 的 Number 属性的值也将更改 b 的 Number 属性的值。即,a 和 b 引用同一个对象。

a.Number = 7
a = NumHandle with properties:Number: 7
b
b = NumHandle with properties:Number: 7

修改函数中的句柄对象

当将句柄对象传递给函数时,MATLAB 会在函数工作区中创建句柄的副本。由于句柄的副本引用相同的底层对象,因此修改句柄对象的函数实际上也会修改调用方工作区中的对象。因此,函数对作为输入参数传递的句柄对象进行修改后,不必将修改后的对象返回给调用方。

删除句柄

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

a = NumHandle;
b = a;
delete(a)
b.NumberInvalid or deleted object.

​​​        对句柄对象调用 delete 会调用该对象的析构函数。具体可以参考句柄类析构函数。

确定对象的相等性

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

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

值对象的相等性

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

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

a 和 b 是独立的,因此不是同一个对象。然而,二者都表示相同的值。如果更改由一个值对象表示的值,这些对象将不再相等。

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

​值类没有默认的 eq 方法来实现 == 运算。

句柄对象的相等性

​        句柄对象从 handle 基类继承 eq 方法。可以使用 == 和 isequal 测试句柄对象之间的两种不同关系:​

  • 句柄引用同一个对象:== 和 isequal 返回 true。

  • 句柄引用同一类且具有相同值的对象,但它们不是同一对象 - 只有 isequal 返回 true。

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

a = NumHandle;
b = a;

使用 == 和 isequal 测试相等性。

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

使用默认值创建 NumHandle 类的两个实例。

a = NumHandle;
b = NumHandle;

确定 a 和 b 是否引用同一个对象。

a == bans =0

确定 a 和 b 是否具有相同的值。

isequal(a,b)ans =1

句柄类支持的功能​

从 handle 类派生的类能够:

  • ​继承多个有用的方法(Handle Class Methods)

  • ​定义事件和侦听程序(事件和侦听程序语法)

  • ​定义动态属性(动态属性 - 向实例添加属性)​

  • ​实现 set 和 get 方法(为属性实现 set/get 接口)

  • ​自定义复制行为(Implement Copy for Handle Classes)

Matlab中句柄类和值类的比较相关推荐

  1. Matlab中句柄对象行为

    目录 句柄对象行为 什么是句柄? 句柄的副本 在函数中修改过的句柄对象 确定对象是否为句柄 删除的句柄对象 句柄对象行为 多个变量可以引用同一个句柄对象.因此,用户与句柄类的实例的交互不同于值类的实例 ...

  2. matlab中句柄图性对像的设置

    1.获取图形对象的属性列表或者属性列表的值 调用格式:get(h,'propernamr'); 可以的得到图形对象h指定的属性值: 2.设置对象属性值 set(h,'propername','prop ...

  3. Matlab中十六进制和二进制值数转换

    目录 使用十六进制和二进制表示法表示整数 将十六进制和二进制值表示为文本 将十六进制值构成的数组表示为文本 将二进制表示转换为十六进制表示 使用二进制值的按位运算 可以将数字表示为十六进制或二进制值. ...

  4. matlab 16位灰度值转8位,在matlab中如何将灰度值为24位的转化为8?

    我使用的是Visual c++6.0技术内幕里提供的类CDib来操作位图,最好提供可以两个独立的函数来分辨别实现着俩个功能.他们可以作为CDib类的成员函数来使用.类似下面的这个就可以,我用了下面的这 ...

  5. MATLAB中如何让分度值小点,实验6 干涉的matlab模拟.doc

    实验6 干涉的matlab模拟.doc MATLAB在光信息处理中的应用课程上机实验(三峡大学2013年)实验6干涉的MATLAB模拟一.实验目的掌握双缝干涉.牛顿环的MATLAB模拟.二.实验内容1 ...

  6. matlab hanning窗口怎么使用,在Python和Matlab中,Hanning窗口值不匹配

    在scipy.signal中,函数hanning已弃用.要使用的函数是scipy.signal.hann.在 numpy.hanning和{}计算相同的窗口. 函数包括窗口末尾的零值.要匹配您在问题中 ...

  7. matlab中memory模块初始值,Matlab的memory模块消除代数环

    什么是代数环? 发生在两个或多个模块在输入端口具有信号直接传递而形成反馈的情况时,直接传递的模块在不知输入端口的值的情况下无法计算出输出端的值,也就是现在时刻的输出是依赖现在时刻的输入值来计算的.当这 ...

  8. matlab中使用阈值二值化,腐蚀,膨胀,反色等操作进行图像处理,去噪声,网纹、摩尔纹等

    有兴趣可以对下方的一些方法和参数进行更换,以达到更好的效果. 主要涉及到二值化,阈值,腐蚀,膨胀,反色等 clc; close all; clear; workspace; fontSize = 14 ...

  9. matlab中变压器电感基值公式,基于MATLAB的变压器短路阻抗计算.pdf

    基于MATLAB的变压器短路阻抗计算 第 卷 第 期 电力机车与城轨车辆 45 6 2)"9 45 :)9 6 年 月 日 !"#$%&'$ ()$)*)%'+#, - . ...

最新文章

  1. .NET架构与模式探索
  2. 84. ExtJS下页面显示中文乱码问题
  3. xml在线解析_python-jsonpath 解析神器
  4. spring+cxf调用webservice接口
  5. Serializing - 序列化 综述 – To be continued.
  6. mysql如何连接jdk,JDBC 简单的Mysql连接
  7. SQLite数据库的使用——利用命令行或Navicat Premium创建数据库
  8. RTSP/GB28181/SDK/EHOME协议视频智能分析共享平台EasyCVR安防视频云服务新增智能人脸识别功能
  9. 32款图片处理软件介绍
  10. js时间差计算的几种方式
  11. fprintf用法解析
  12. getch计算机错误,为什么getch()在C中抛出一个错误
  13. 关于论文组会的一些思考(其一)
  14. 推荐一部非常精彩的小说
  15. 【SAP】SAP FI,中英日专业名词对照表
  16. html5+自动播放轮播插件,15个超强的jQuery/HTML5图片轮播插件
  17. android8 三星a9,三星GalaxyA9评测 已经远远超出中端手机的水平
  18. win 7 64位系统安装java jdk 遇到could not find the required version of the java 2 runtime environment 错误
  19. 大学生一定要理解的15件事
  20. 矿大计算机学院周裕浩,计算机学院学子在第45届ACM-ICPC亚洲区决赛获佳绩

热门文章

  1. 2022中国统计年鉴Excel版
  2. 如何用VS2019编写C语言程序
  3. html转换为pdf c#,NET(C#)中使用pdf2htmlEX实现pdf向html的格式转换器
  4. vivos5手机root教程,vivoy5s怎样root
  5. YMatrix 5.0 重磅发布,以性能突破引领万物智联下的数据库最佳形态
  6. VIPKID从“快进键”到“慢进键” 的自我突围。
  7. linux 进程的fg,36.每日一个Linux命令----先后台进程切换(fg、bg、jobs、)
  8. Java之多线程全解析
  9. BUU-[极客大挑战 2019]Upload1
  10. 未来教育计算机二级vb题库,2019年3月计算机二级VB考试巩固试题及答案001