2011-06-22 25 views
13

我有一些C++背景,希望在Matlab中使用類。句柄和值類的區別

句柄和值類之間有什麼區別?

我知道如果我想用重載運算符(如「+」和「*」)定義矩陣類,我會使用值類。然而,有時候,當我選擇一個句柄類時,事情似乎只適用於我。

回答

19

MathWorks提供了一些關於哪些用途用於helpPDF documentation中的哪些用途的信息。我還從Yagtom Project(最初由Matt Dunham)發現this article是對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))。

  • 如果您的類的主要關注點是存儲(數值)某種類型的值並且能夠執行操作,那麼值類最有可能是要走的路。
  • 如果你想存儲一個狀態,組相關的值,將不同的對象連接在一起(鏈接列表,圖形,...),句柄類可能是要走的路。

或者至少,這是我傾向於用來作出區分。

0

它實際上非常簡單,與您記錄的語言不同。處理類通過引用傳遞。值類按值傳遞。與c/C++的區別在於,機制是類型系統的一部分,而不是可以在任何變量上執行的操作。