句柄和值类的差异

时间:2011-06-22 07:44:26

标签: matlab oop

我有一些C ++背景,并希望在Matlab中使用类。

句柄和值类之间有什么区别?

我知道如果我想用重载运算符(如“+”和“*”)定义矩阵类,我会使用值类。但是,有时似乎只有在我选择句柄类时,事情才对我有用。

2 个答案:

答案 0 :(得分:21)

MathWorks提供了一些信息,用于在helpPDF documentation中使用哪些用途。我还从this article(最初由Yagtom Project)中找到了Matt Dunham,以便在MATLAB中对OOP进行了很好的介绍。

在帮助中,这解释如下(强调我的):

  

MATLAB支持两种类 - 句柄类和值类。您使用的类类型取决于类实例的所需行为以及您要使用的功能。

     

如果要创建对类对象中包含的数据的引用,并且不希望对象的副本生成对象数据的副本,请使用句柄类。例如,使用句柄类来实现包含电话簿条目信息的对象。多个应用程序可以访问特定的电话簿条目,但只能有一组基础数据。

     

句柄的引用行为使这些类能够支持事件,侦听器和动态属性等功能。

     

使用值类来表示不需要唯一的实体,例如数值。例如,使用值类来实现多项式数据类型。你可以复制

在马特邓纳姆的文章中,另一个好点是区分两种类型:

  

我们之前提到Matlab中的对象(默认情况下)通过值传递,这意味着完整副本在方法调用中来回传递。但是,Matlab图形对象是通过引用传递(通过句柄)。如果我们继承内置句柄类 [...] ,那么我们类的对象也将通过引用传递,而不是值。

我个人倾向于使用句柄类来获取我习惯使用Java的一些语法: 对于句柄类,您可以让对象存储所有信息,以便您可以执行sort(a)(或a.sort())之类的操作。 对于值类,相当于a = sort(a)(或a = a.sort())。对于运算符而言,第一种语法根本没有意义,但第二种语言显然是普遍使用的:例如a = a + b(相当于a = plus(a,b)a = a.plus(b))。

  • 如果您的类的主要关注点是存储某些类型的值(数值)并且能够执行操作,那么值类很可能是最佳选择。
  • 如果要存储状态,组相关值,将不同的对象连接在一起(链接列表,图形,...),则可以使用句柄类。

或者至少,这是我倾向于用来区分的。

答案 1 :(得分:0)

它实际上非常简单,与您注意的语言不同。句柄类通过引用传递。值类按值传递。与c / c ++的区别在于机制是类型系统的一部分,而不是可以对任何变量执行的操作。