C 結構體和類的區別

2021-07-30 07:26:06 字數 2986 閱讀 2918

結構體和類的區別:

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

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

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結構體 C 結構體 和 C 類的區別

c結構體 c 結構體基本相同,c 類主要是方法的實現。結構體是資料型別的集合 類是資料型別加方法的集合,基本如此,更注重方法。1.c的結構體和c 結構體的區別 1 c的結構體內不允許有函式存在,c 允許有內部成員函式,且允許該函式是虛函式。所以c的結構體是沒有建構函式 析構函式 和this指標的。2...

C 結構體和類的區別

c c 結構體的區別 c中的結構體和c 中結構體的不同之處 在c中的結構體只能自定義資料型別,結構體中不允許有函式,而c 中的結構體可以加入成員函式。c 中的結構體和類的異同 一 相同之處 結構體中可以包含函式 也可以定義public private protected資料成員 定義了結構體之後,可...

C 結構體和類的區別

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