C 中結構 struct 與類 class 的區別

2021-04-22 10:16:49 字數 1539 閱讀 3934

像類一樣,結構(struct)是能夠包含資料成員和函式成員的資料結構,但是與類不同,結構是值型別,不需要堆分配。結構型別的變數直接儲存該結構的資料,而類型別的變數則儲存對動態分配的物件的引用。結構型別不支援使用者指定的繼承,並且所有結構型別都隱式地從型別 object 繼承。

結構對於具有值語義的小型的資料結構特別有用。複數、座標系中的點或字典中的「鍵-值」對都是結構的典型示例。對小型資料結構而言,使用結構而不使用類會大大節省應用程式分配的記憶體量。例如,下面的程式建立並初始化乙個含有 100 個點的陣列。對於作為類實現的 point,出現了 101 個例項物件,其中,陣列需要乙個,它的 100 個元素每個都需要乙個。

class point

} class test

} 一種替代辦法是將 point 定義為結構。

struct point

} 現在,只有乙個物件被例項化(即用於陣列的那個物件),而 point 例項以值的形式直接內聯保存在陣列中。

結構建構函式也是使用 new 運算子呼叫,但是這並不意味著會分配記憶體。與動態分配物件並返回對它的引用不同,結構建構函式直接返回結構值本身(通常是堆疊上的乙個臨時位置),然後根據需要複製該結構值。

對於類,兩個變數可能引用同一物件,因此對乙個變數進行的操作可能影響另乙個變數所引用的物件。對於結構,每個變數都有自己的資料副本,對乙個變數的操作不可能影響另乙個變數。例如,下面的**段產生的輸出取決於 point 是類還是結構。

point a = new point(10, 10);

point b = a;

a.x = 20;

console.writeline(b.x);

如果 point 是類,輸出將是 20,因為 a 和 b 引用同一物件。如果 point 是結構,輸出將是 10,因為 a 對 b 的賦值建立了該值的乙個副本,因此接下來對 a.x 的賦值不會影響 b 這一副本。

前一示例突出了結構的兩個限制。首先,複製整個結構通常不如複製物件引用的效率高,因此結構的賦值和值引數傳遞可能比引用型別的開銷更大。其次,除了 ref 和 out 引數,不可能建立對結構的引用,這樣限制了結構的應用範圍。

總結,主要有這麼幾點不同:

1.struct 是值型別,class 是物件型別

2.struct 不能被繼承,class 可以被繼承

3.struct 預設的訪問許可權是public,而class 預設的訪問許可權是private.

4.struct總是有預設的建構函式,即使是過載預設建構函式仍然會保留。這是因為struct的建構函式是由編譯器自動生成的,但是如果過載建構函式,必需對struct中的變數全部初始化。並且struct的用途是那些描述輕量級的物件,例如line,point等,並且效率比較高。class在沒有過載建構函式時有預設的無引數建構函式,但是一被過載些預設建構函式將被覆蓋。

5.struct的new和class的new是不同的。struct的new就是執行一下建構函式建立乙個新例項再對所有的字段進行copy。而class則是在堆上分配一塊記憶體然後再執行建構函式,struct的記憶體並不是在new的時候分配的,而是在定義的時候分配

C 的類(Class)與結構(Struct)

在 c 中,結構是值型別資料結構。它使得乙個單一變數可以儲存各種資料型別的相關資料。struct關鍵字用於建立結構。結構是用來代表乙個記錄。假設您想跟蹤圖書館中書的動態。您可能想跟蹤每本書的以下屬性 為了定義乙個結構,您必須使用 struct 語句。struct 語句為程式定義了乙個帶有多個成員的新...

C 類 class 與結構 struct 的異同

結構與類共享幾乎所有相同的語法,但結構比類受到的限制更多 儘管結構的靜態字段可以初始化,結構例項字段宣告還是不能使用初始值設定項。結構不能宣告預設建構函式 沒有引數的建構函式 或析構函式。結構的副本由編譯器自動建立和銷毀,因此不需要使用預設建構函式和析構函式。實際上,編譯器通過為所有字段賦予預設值 ...

c 中的結構 struct

c 中的結構使用struct關鍵字來宣告型別,struct型別是一種值型別,通常用來封裝小型相關變數組,和類是引用型別是不同的,乙個簡單例子 public struct custompoint public void printpoint ny x,y 幾點說明 1 可以為struct定義建構函式和...