練習筆記#Class 和 Struct的比較

最近看了ㄧ些面試常被問到的題目,例如:Class 和 Struct的比較或是能否說出它們的優缺點各是什麼。順便再來複習一下。

Struct : ( 是Value Type)

優點:Struct用來儲存較簡單的資料。

用途:

  • 用來建立較為簡單的數據結構,可能包含少量屬性。
  • 適合表示較小的數據單元,如坐標、日期、色彩等。

特點:

  • 不支援繼承,無法擴展其功能。
  • 是值型別,被分配到變數或傳遞給函數時,實際上是傳遞了該實例的副本。

適用情境:

當你僅需表示一個數據結構,或是希望避免引用語意和記憶體管理問題時,通常使用結構。

在這個例子中,我們定義了一個名為 Mazdastruct,它有兩個屬性 yearcolor。然後我們建立了兩個 Mazda 實例 Mazda3Mazda6,並將 Mazda6 指派給 Mazda3 的值。

由於 struct 是Value Type,在指派 Mazda6 = Mazda3 時,Mazda6 會得到 Mazda3 的一個全新複製值,而不是引用。

接下來,我們將 Mazda3year 屬性改為 2023。由於 Mazda3Mazda6 現在是兩個獨立的實例,所以改變 Mazda3 的值不會影響 Mazda6

因此,輸出結果會是:

Mazda3.year 會輸出 2023,因為我們剛剛修改過它的值。 Mazda6.year 會輸出 2019,因為它是從原始 Mazda3 複製過來的值,並未受到修改的影響。

這展示了 struct 作為Value Type,在複製和指派時會建立全新實例的行為,與Reference Type class 不同。

Class : (是Reference Type)

優點:用來儲存較複雜的資料與

用途:

  • 用來建立較為複雜的物件,可能包含多個屬性和方法。
  • 適合表示具有共享狀態或功能的實體,例如用戶、汽車、動物等。

特點:

  • 支援繼承,子類可以擴展和修改父類的行為。
  • 是引用型別,被分配到變數或傳遞給函數時,實際上是傳遞了對該實例的引用。

適用情境:

  • 當你需要建立一個有屬性和方法的物件,並且這些物件需要被多處使用時,通常使用類。
  1. 定義了一個名為 Mazdaclass
  2. 創建了兩個 Mazda 實例 mazda3mazda6,並將 mazda6 指派給 mazda3
  3. 由於 class 是Reference Type,在指派 mazda6 = mazda3 時,mazda6mazda3 都引用了同一個實例,而不是建立新的複製。
  4. 當我們將 mazda3year 屬性改為 2023 時,由於 mazda3mazda6 引用同一個實例,因此改變會影響到兩者。
  5. 最後,我們分別打印 mazda3.yearmazda6.year

因此,輸出結果會是:

mazda3.yearmazda6.year 都會輸出 2023,因為它們引用的是同一個實例,且該實例的 year 屬性已被修改為 2023。因為Class 有繼承的特性子類可以擴展和修改父類的行為。

這展示了 class 作為Reference Type,在指派時不會建立新的實例副本,而是共享同一個實例的行為,與Value Type 的struct 不同。

總結:

如果你需要建立具有較複雜行為和功能的實體,並且可能需要在不同地方共享這些實體,Class可能是更好的選擇。而如果你僅需表示較簡單的數據結構,且不需要繼承和共享行為,Struct 可能更合適。

也可請AI 幫忙做成表格來看比較好懂及清楚。

ReferenceType

EX: Class、Closure、Function

Value type

Struct、Tuple、Enum、Array、Int、 Float、 Double、 String

參考文章

--

--