【发布时间】:2011-06-22 07:44:26
【问题描述】:
我有一些 C++ 背景,想在 Matlab 中使用类。
句柄和值类有什么区别?
我知道,如果我想用“+”和“*”等重载运算符定义矩阵类,我会使用值类。但是,有时当我选择句柄类时,似乎只有我想要的东西才对我有用。
【问题讨论】:
我有一些 C++ 背景,想在 Matlab 中使用类。
句柄和值类有什么区别?
我知道,如果我想用“+”和“*”等重载运算符定义矩阵类,我会使用值类。但是,有时当我选择句柄类时,似乎只有我想要的东西才对我有用。
【问题讨论】:
MathWorks 在其help 和PDF documentation 中提供了一些关于哪些用途的信息。我还发现 Yagtom Project(最初由 Matt Dunham 提供)中的 this article 是对 MATLAB 中 OOP 的一个很好的介绍。
在帮助中解释如下(强调我的):
MATLAB 支持两种类——句柄类和值类。您使用的类类型取决于类实例的所需行为以及您要使用的功能。
当您想要创建对包含在类的对象中的数据的引用并且不希望对象的副本复制对象数据时,请使用 句柄类。例如,使用句柄类来实现包含电话簿条目信息的对象。多个应用程序可以访问特定的电话簿条目,但只能有一组基础数据。
句柄的引用行为使这些类能够支持事件、侦听器和动态属性等功能。
使用值类来表示不需要唯一的实体,例如数值。例如,使用值类来实现多项式数据类型。你可以复制
在 Matt Dunham 的文章中,另一个很好的观点是区分这两种类型:
我们之前提到过,Matlab 中的对象(默认情况下)按值传递,这意味着完整副本在方法调用中来回传递。然而,Matlab 图形对象通过引用传递,(通过句柄)。如果我们将内置句柄类 [...] 子类化,那么我们类的对象也将通过引用而不是值传递。
我个人倾向于使用句柄类来获得一些我习惯于使用 Java 的语法:
对于句柄类,您可以让对象存储所有信息,以便您可以就地执行sort(a)(或a.sort())之类的操作。
对于值类,这相当于a = sort(a)(或a = a.sort())。对于运算符,第一种语法根本没有意义,但第二种显然是普遍使用的:例如a = a + b(相当于a = plus(a,b)和a = a.plus(b))。
或者至少,这是我用来区分的。
【讨论】:
它实际上非常简单,并且与您记下的语言不同。句柄类通过引用传递。值类按值传递。与 c/c++ 的区别在于机制是类型系统的一部分,而不是可以对任何变量执行的操作。
【讨论】: