C中結構體與C 中類的區別

2021-07-10 18:35:03 字數 3435 閱讀 9581

一、先說一下c中的結構體:

作用:為了將不同型別的資料組合成乙個有機的整體。

1、定義結構體變數的方式,例子:

struct student//結構體型別名

struct student lucy;//結構體變數名

struct student *p = &lucy;//結構體指標變數名

解析:

(1)、結構體型別名:student

指定了乙個結構體型別(就如同基本型別-int的型別),它相當於乙個模型,但其中並無具體資料,系統對之也不分配實際的記憶體單元。

(2)、結構體變數名:lucy

實際分配記憶體空間,為了能在程式中使用結構型別的資料,應當定義結構體型別的變數,並在其中存放具體的資料。

(3)、結構體指標變數名:p

指向結構體變數首位址的指標;通過結構體指標即可訪問該結構體變數。

以下三種方式等價:

lucy.num = 123;

(*p).num = 123;

p->num = 123;

2、struct的成員對齊

(1)、自然對界--即預設對齊方式,是指按結構體的成員中size最大的成員對齊。

struct是一種復合資料型別,其構成元素既可以是基本資料型別(如int、long、float等)的變數,也可以是一些復合資料型別(如array,struct,union等)的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下,編譯器為結構體的每個成員按其自然對界條件分配空間。各個成員按照他們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個結構的位址相同。

例如:

struct naturalalign

;

在上述結構體中,size最大的是short,其長度為2位元組,因而結構體中的char成員a、c都以2為單位對齊。sizeof(naturalalign)的結果等於6。

(2)、指定對界

一般的可以通過下面的方法來改變預設的對界條件:

使用偽指令#pragma pack (n),編譯器將按n個位元組對齊;

使用偽指令#pragma pack(),取消自定義位元組對齊方式。

注意:如果#pragma pack (n)中指定的n大於結構體中最大的成員的size,則其不起作用,結構體仍按照size最大的成員進行對界。

例如:

#pragma pack (n)

struct naturalalign

;

#pragma pack ()

當n為4、8、16時,其對齊方式均一樣,sizeof(naturalalign)的結果都等於12。而當n為2時,其發揮了作用,使得sizeof(naturalalign)的結果為6。

3、位段的使用

有時儲存乙個資訊不必用乙個或多個位元組,只需要乙個位元組中的乙個或幾個二進位制位;c語言允許在乙個結構體中以單位來指定其成員所佔記憶體長度,以位為單位的成員稱為「位段」或「位域」。

例如:

struct packed_data

data;

其中,a,b,c,d分別佔2位,6位,4位,4位,i為整型佔4個位元組。

注意:

賦值時,不要超出位段定義的範圍;位段成員的型別必須為整型或字元型;乙個位段必須存放在乙個儲存單元中,不能跨兩個單元,第乙個單元空間不能容納下乙個位段,則該空間不用,而從下乙個單元起存放該位段;位段的長度不能大於儲存單元的長度。

二、說一下c++中的類

一般來說,類規範由兩個部分組成:

類宣告:以資料成員的方式描述資料部分,以成員函式(被稱為方法)的方式描述公有介面。

類方法的定義:描述如何實現類成員函式。

典型的類宣告格式如下:

class classname

;

三、最後說一下結構和類的區別

類描述看上去很像是包含成員函式以及public和private可見性的結構宣告。實際上,c++對結構進行了擴充套件,使之具有與類相同的特性,它們之間唯一的區別是,結構的預設訪問型別是public,而類為private。c++程式設計師通常使用類來實現描述,而把結構限制為只表示純粹的資料物件或沒有私有部分的類。

另外需要注意的是:

1、c++中的struct保持了對c中struct 的全面相容,因而下面的操作是合法 的:

//定義struct

struct structa

;

structa a = ;//定義時直接賦初值

即struct可以在定義的時候直接以{}對其成員變數賦初值,而clas則不能。

2、存在指標成員時的考慮

在c語言中,當結構體中存在指標型成員時,一定要注意在採用賦值語句時是否將兩個例項中的指標型成員指向同一片記憶體。

在c++語言中,當結構體中存在指標型成員時,我們需要重寫struct的拷貝函式並進行「=」操作符過載。

C 中結構體與類的區別

學習了c 的物件導向,最常見的和寫的就是類結構體,下面主要介紹一下結構體和類的區別。首先類是c 中物件導向獨有的,但是c和c 中都有結構體,下面我們來看一下c和c 中結構體的區別。這裡主要從封裝 多型 繼承 封裝和訪問許可權幾個方面來說。1 c和c 中結構體的區別 1 多型 c的結構體內不允許有函式...

C 中結構體與類的區別

1,定義和使用非常相似,例子如下 public struct student public class question 使用 student s new student question q new question 2,兩者都是container型別,這表示它們可以包含其他資料型別作為成員。3,...

C語言結構體與C 中類的區別

c語言中有結構體的概念,沒有類的概念,因為類是物件導向才有的概念,所以在c 中有了類的概念,從一定程度上來說,類可以看成是結構體的昇華。但是除此之外,c 中也有結構體的概念,但是和c語言中是不同的。在c語言的結構體中只能自定義資料型別,不允許有函式,而c 中的結構體可以加入成員函式。那麼c 的結構體...