c 結構解析

2021-04-06 14:03:10 字數 3101 閱讀 1074

1.結構的宣告

· 結構是使用者自定義的值型別

struct pair

struct pair

struct pair

;//可以有結尾分號

結構是c#程式設計師用來定義自己的值型別的最普遍的機制。結構比列舉更強大,因為它提供函式、字段、建構函式、操作符和訪問控制。結構成員的預設訪問許可權是private(在c++中是public)。當你定義結構的成員名時,不要忘了對公有成員使用pascalcase規則,而對非公有成員使用 camelcase規則。

結構類的宣告中雖然可以使用結尾分號,但建議你不要使用,這只不過是為了照顧c++程式設計師的習慣。

2.值的產生

· 乙個結構類的變數存在於棧(stack)中

w 字段不是被預先賦值的

w 字段只有被賦值後才能讀

w 使用點操作符來訪問成員

下面的例子假設pair是一結構,它有兩公有整數類成員x,y

static void main()

static void main()

結構類的變數存在於棧中。在上面的例子中,雖然宣告了乙個叫p的pair類結構變數,但實際上只是宣告兩個區域性變數p.x和p.y的一種簡寫形式。

上面例子中的第一段程式的console.write試圖使用p.x的值,但它是錯誤的,因為p.x沒有被賦初值。

3.值的初始化

· 乙個結構變數:

w 總是能使用預設建構函式來進行初始化

w 預設建構函式把字段初始化為0/false/null

static void main()

static void main()

除了上面介紹的初始化方法外,還可以使用預設建構函式來初始化乙個結構變數。呼叫建構函式總是使用new關鍵字。乙個結構變數是值型別的,它直接存在於棧中,new關鍵字的使用不會在堆中開闢記憶體。結構的預設建構函式總是把結構變數中的所有字段初始化(你不能改變這一行為,在下面一節會講到)。

c++程式設計師注意:在c#中呼叫預設建構函式必須使用括號。

pair p = new pair; //錯誤

pair p = new pair();//正確

4.值的建構函式

· 一般規則

w 編譯器宣告預設建構函式

w 你不能宣告預設建構函式

w 預設建構函式把所有的例項字段初始化為0/false/null

struct pair

//編譯器宣告一預設建構函式

struct pair

}//錯誤,不能自己宣告預設建構函式

struct pair

}//正確,但編譯器宣告的預設建構函式仍存在

結構類總有一編譯器宣告的公有的預設建構函式。不管你有沒有宣告建構函式,編譯器宣告的公有的預設建構函式總是存在的。所以你不能定義預設建構函式,這樣會出現兩個預設建構函式,這是不允許的。但要注意的是,這只適合於結構,對於類是不適用的。編譯器產生的預設建構函式把所有的例項字段歸零化:

l bool型化為false

l 整型(包括字元型)化為0

l 實型化為0.0

l 列舉型化為0

l 引用型(包括字串)化為null

使用者自定義的結構類的建構函式的預設訪問許可權是private,和結構類的字段一樣。

c#不允許你宣告乙個和建構函式名字一樣的函式。

5.:this(…)

· 乙個建構函式可以呼叫另一建構函式

struct colouredpoint

public colouredpoint(int x, int y, colour c)

...private int x, y;

private colour c;

}6.c#中結構與類的區別

**:xx

一 .類與結構的差別

1. 值型別與引用型別

結構是值型別:值型別在堆疊上分配位址,所有的基型別都是結構型別,例如:int 對應system.int32 結構,string 對應 system.string 結構 ,通過使用結構可以建立更多的值型別

堆疊的執行效率要比堆的執行效率高,可是堆疊的資源有限,不適合處理大的邏輯複雜的物件。所以結構處理作為基型別對待的小物件,而類處理某個商業邏輯

因為結構是值型別所以結構之間的賦值可以建立新的結構,而類是引用型別,類之間的賦值只是複製引用

注:1.雖然結構與類的型別不一樣,可是他們的基型別都是物件(object),c#中所有型別的基型別都是object

2.雖然結構的初始化也使用了new 操作符可是結構物件依然分配在堆疊上而不是堆上,如果不使用「新建」(new),那麼在初始化所有字段之前,欄位將保持未賦值狀態,且物件不可用

2.繼承性

結構:不能從另外乙個結構或者類繼承,本身也不能被繼承,雖然結構沒有明確的用sealed宣告,可是結構是隱式的sealed .

類:完全可擴充套件的,除非顯示的宣告sealed 否則類可以繼承其他類和介面,自身也能被繼承

注:雖然結構不能被繼承 可是結構能夠繼承介面,方法和類繼承介面一樣

例如:結構實現介面

inte***ce iimage

struct picture : iimage

private int x, y, z; // other struct members

}3.內部結構:

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

沒有析構函式

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

不能有protected 修飾符

可以不使用new 初始化

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

類:有預設的建構函式

有析構函式

可以使用 abstract 和 sealed

有protected 修飾符

必須使用new 初始化

二.如何選擇結構還是類

討論了結構與類的相同之處和差別之後,下面討論如何選擇使用結構還是類:

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

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

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

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

C 解析結構體指標

在解析結構體指標前,必須知道結構體是如何定義的。在c 中同樣定義該結構體。code structlayout layoutkind.sequential public struct vgastat 定義完結構體後,就可將接收到的結構體指標轉換為定義的結構體物件。vgastat entries vga...

解析C語言結構體,位段。

1.結構的定義 聚合資料型別能夠同時儲存超過乙個的單獨資料。c語言提供了兩種型別的聚合資料型別,陣列與結構。陣列是相同型別元素的集合,它的每個元素是通過下標引用或指標間接訪問來選擇的。結構也是一些值的集合,這些值成為它的成員,但乙個結構的各個成員可能具有不同的型別。每個結構成員都有自己的名字,它們是...

簡單解析C語言結構體

1.結構體的定義 結構體是由一系列具有相同型別或不同型別的資料構成的資料集合,叫做結構。在c語言中,結構體指的是一種資料結構。宣告乙個結構體型別的一般形式如下 struct 結構體名 具體宣告如下所示 struct struct 注意最後乙個有分號 注意 結構體型別的名字是又乙個關鍵字struct和...