C 學習筆記16 結構體和類

2021-08-08 20:37:06 字數 2986 閱讀 7460

結構體和類的區別:

在做乙個專案時,使用了較多的結構體,並且存在一些結構體的巢狀,即某結構體成員集合包含另乙個結構體等,總是出現一些奇怪的錯誤,才終於下決心好好分析一下到底類和結構體有啥不同,雖然它們很相似,但確實有很大的不同,用不好難免出的問題會比較多,現總結一下:

一、結構體和類非常相似:

1,定義和使用非常相似,例子如下:

public struct student

public class question

使用:student s=new student();

question q=new question();

2,兩者都是container型別,這表示它們可以包含其他資料型別作為成員。

3,兩者都擁有成員,包括:建構函式、方法、屬性、字段、常量、列舉型別、事件、以及事件處理函式。

4,兩者的成員都有其各自的訪問範圍。例如,可以將某乙個成員宣告為public,而將另乙個成員宣告為private。

5,兩者都可以實現介面。

6,兩者都可以公開乙個預設屬性,然而前提是這個屬性至少要取得乙個自變數。

7,兩者都可以宣告和觸發事件,而且兩者都可以宣告委託(delegate)。

二、結構體和類的主要區別

在網上摘抄了兩段:

=====第一段:=====

1,結構是實值型別(value types),而類則是引用型別(reference types)。

2,結構使用棧儲存(stack allocation),而類使用堆儲存(heap allocation)。

3,所有結構成員預設都是public,而類的變數和常量數則預設位private,不過其他類成員預設都是public。

4,結構成員不能被宣告位protected,而類成員可以。

5,結構變數宣告不能指定初始值、使用new關鍵字貨對陣列進行初始化,但是類變數宣告可以。

6,結構不能宣告預設的建構函式,也就是不擁有引數的非共享建構函式,但是類則無此限制。

7,二者都可以擁有共享建構函式,結構的共享建構函式不能帶有引數,但是類的共享建構函式則可以帶或者不帶引數。

8,結構不允許宣告析構函式(destructor),類則無此限制。

9,結構的例項(instance)宣告,不允許對包含的變數進行初始化設定,類則可以在宣告類的例項時,同時進行變數初始化。

10,結構是隱式繼承自valuetype類,而且不能繼承任何其他型別,類則可以繼續自valuetype以外的任何類。

11,結構是無法被繼承的,類則可以。

12,結構永遠不會終止,因此clr不會在任何結構上呼叫finalize方法。類則是由記憶體**程序加以終止,當記憶體**程序檢測到沒有任何作用的類時,它就會呼叫類的finalize方法。

13,結構不需要建構函式,類則需要建構函式。

14,結構只能在一種情況下使用非共享建構函式,那就是非共享建構函式會接受引數。但是類則無此限制,它可以使用帶引數或不帶引數的非共享建構函式。

14,每乙個結構都具有無引數的隱含公共建構函式,此建構函式會將結構的所有成員初始化為其預設值。不需要重新定義這個行為。

在「例項和變數」層面上,由於結構是數值型別的,因此每乙個結構變數會永遠的繫結到結構例項上。然而類是引用型別的,而且物件變數可引用不同的類例項,在此方面的區別,會對使用將結構和類造成如下的影響:

15,結構變數會隱式的使用結構的無引數建構函式來初始化成員,這就意味語句 struct s = new struct()。

16,當您將乙個結構變數賦值給另乙個,或者將結構例項傳遞到程式變數時,所有變數成員的值會複製到新的結構中。當您將乙個物件變數賦值給另乙個,或者將物件變數傳遞給程式時,則只是複製指標。

17,您可以將null值賦值給結構變數,但是該例項會一直與該變數保持關聯。雖然變數成員會因此賦值而重新初始化,但是您還是可以呼叫變數的方法並訪問其資料成員。相反的,如果您將物件變數設定為null,您就會中斷它與任何型別例項的關聯,而且除非您再將另乙個例項賦值給它,否則無法通過變數訪問任何成員。

18,您可以在不同時間將不同的類的例項賦值給同乙個物件變數,而且在同一時間可有好幾個物件變數引用相同的類例項,如果您對類成員值做了改變,則其他指向相同例項的物件變數也會發生改變。然而,結構成員則會封裝在他們自己的例項中,變更結構成員值並不會對其他任何結構變數的成員造成影響,甚至也不會影響相同結構宣告的其他例項。

19,兩個結構必須以成員對成員的比較方式來執行相等比較。兩個物件變數可以使用equals方法來加以比較。equals會判斷兩個變數是否指向相同的例項。

=====第二段:=====

1,結構體是一種值型別,而類是引用型別。值型別用於儲存資料的值,引用型別用於儲存對實際資料的引用。那麼結構體就是當成值來使用的,類則通過引用來對實際資料操作。

2,結構體的定義是:有些資料既是相互關聯的,又共同描述乙個完整事物,如:乙個學生的整體資訊,學號、姓名、性別等。而類則使用在需要比較有層次的資料上面。

3,類是反映現實事物的一種抽象,而結構體的作用只是一種包含了具體不同類別資料的一種包裝,結構體不具備類的繼承多型特性

4,建構函式是為了初始化類的字段而存在的,而結構體並不需要初始化就能使用,因此,結構體中並不存在預設的建構函式。

結構:沒有預設的建構函式,但是可以新增建構函式

沒有析構函式

沒有 abstract 和 sealed(因為不能繼承)

不能有protected 修飾符

可以不使用new 初始化

在結構中初始化例項欄位是錯誤的

類: 有預設的建構函式

有析構函式

可以使用 abstract 和 sealed

有protected 修飾符

必須使用new 初始化

三.如何選擇結構還是類

1.  堆疊的空間有限,對於大量的邏輯的物件,建立類要比建立結構好一些

2.   結構表示如點、矩形和顏色這樣的輕量物件,例如,如果宣告乙個含有 1000 個點物件的陣列,則將為引用每個物件分配附加的記憶體。在此情況下,結構的成本較低。

3.  在表現抽象和多級別的物件層次時,類是最好的選擇

4.  大多數情況下該型別只是一些資料時,結構時最佳的選擇

C 筆記(2)結構體和類

個人宣告 本文僅作為作者本人記錄學習過程遇到的問題以及對這些問題的思考,作者也會隨著學習進度進行相應的修改。為了避免誤人子弟,請所有讀者在閱讀本文內容時,時刻保持懷疑的態度,用批判性眼光閱讀!結構體實現 include using namespace std 堆疊的資料物件集 typedef int...

Swift學習筆記 七 類和結構體

類和結構體的比較 1 相同點 定義屬性用於儲存值 定義方法用於提供功能 定義下標用於通過下標語法訪問值 定義構造器用於生成初始化值 通過擴充套件以增加預設實現的功能 符合協議以對某類提供標準功能 2 與結構體相比,類還有如下的附加功能 繼承允許乙個類繼承另乙個類的特徵 型別轉換允許在執行時檢查和解釋...

swift學習筆記 4 結構體和類

類和結構體 相同點 1.類和結構體都可以定義屬性和方法 這是和c oc中的結構體的最大區別 2.類和結構體中都能定義構造器方法 不同點 1.類可以在析構體deinit中釋放資源,結構體不可以 2.類可以繼承.結構體是不能被繼承 3.類是乙個引用型別,乙個例項可以有多個引用,操作的是例項的本身 結構體...