我有一些C ++背景,并希望在Matlab中使用类。
句柄和值类之间有什么区别?
我知道如果我想用重载运算符(如“+”和“*”)定义矩阵类,我会使用值类。但是,有时似乎只有在我选择句柄类时,事情才对我有用。
答案 0 :(得分:21)
MathWorks提供了一些信息,用于在help和PDF 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 ++的区别在于机制是类型系统的一部分,而不是可以对任何变量执行的操作。