struct在c和c 中的區別

2021-09-19 01:25:46 字數 2975 閱讀 1028

c語言中:

struct是使用者自定義資料型別(udt)。

c中的struct是沒有許可權設定的。

c中的struct只能是一些變數的集合體,可以封裝資料卻不可以隱藏資料,而且成員不可以是函式。

struct中間的某個型別(例如int)不可以直接初始化。

c++語言中:

struct是抽象資料型別(adt),支援成員函式的定義。

c++中struct增加了訪問許可權,且可以和類一樣有成員函式。 c++中的struct等同於class,只是class預設成員許可權是private,而struct預設成員許可權是public。c++ struct裡面成員初始化的形式和類是相同的,不可以直接初始化,就是不可以定義成員的時候同時初始化。

在標準c++中,struct和class有兩個區別:

第一:struct中的成員預設是public的,class中的預設是private的。

第二:在用模版的時候只能寫template 或template 不能寫template 。

此外,如果沒有多型和虛擬繼承,在c++中,struct和class的訪問效率完全相同!簡單的說就是,訪問class的data member和非virtual function效率和struct完全相同!不管該data member是定義在基類還是派生類的。

如果不是為了和c相容,c++中就不會有struct關鍵字。因此建議是:如果不需要與c相容或傳遞引數給c程式,不要在c++中用struct。

注意class的data member在記憶體中的布局可不一定是data member的申明次序。c++只保證處於同乙個access section的data member按照申明次序排列。

結合typedef的用法

在c中定義乙個結構體型別要用typedef:

typedef

struct student stu;

於是在宣告變數的時候就可:stu stu1;(如果沒有typedef就必須用struct student stu1;來宣告)

這裡的stu實際上就是struct student的別名。stu==struct student

另外這裡也可以不寫student(於是也不能struct student stu1 了,必須是stu stu1,如下

typedef

struct

stu;

但在c++裡很簡單,直接

struct student 

;

於是就定義了結構體型別student,宣告變數時直接student stu2;

2. 在c++中如果用typedef的話,又會造成區別:

struct student stu1;

//stu1是乙個變數 注意!!!!!!!!!

typedef

struct student2 stu2;

//stu2是乙個結構體型別=struct student2

使用時可以直接訪問stu1.a

但是stu2則必須先 stu2 s2;

然後 s2.a=10;

如果在c程式中我們寫:

typedef

struct

aaa,bbb,ccc;

這算什麼呢?

我個人觀察編譯器(vc6)的理解,這相當於

typedef

struct

aaa;

typedef aaa bbb;

typedef aaa ccc;

也就是說aaa,bbb,ccc三者都是結構體型別。宣告變數時用任何乙個都可以,在c++中也是如此。但是你要注意的是這個在c++中如果寫掉了typedef關鍵字,那麼aaa,bbb,ccc將是截然不同的三個物件。

//此處不是很理解。

typedef struct和struct的區別:

typedef

struct tagmystruct

mystruct;

上面的tagmystruct是識別符號,mystruct是變數型別(相當於(int,char等))。

這語句實際上完成兩個操作:

定義乙個新的結構型別

struct tagmystruct

;

分析:tagmystruct稱為「tag」,即「標籤」,實際上是乙個臨時名字,不論是否有typedefstruct 關鍵字和tagmystruct一起,構成了這個結構型別,這個結構都存在。

我們可以用struct tagmystruct varname來定義變數,但要注意,使用tagmystruct varname來定義變數是不對的,因為struct 和tagmystruct合在一起才能表示乙個結構型別。

2) typedef為這個新的結構起了乙個名字,叫mystruct。

typedef struct tagmystruct mystruct;

因此,mystruct實際上相當於struct tagmystruct,我們可以使用mystruct varname來定義變數。

typedef

struct tagmystruct

mystruct;

在c中,這個申明後申請結構變數的方法有兩種:

(1)struct tagmystruct 變數名

(2)mystruct 變數名

在c++中可以有

(1)struct tagmystruct 變數名

(2)mystruct 變數名

(3)tagmystruct 變數名

struct在C和C 中的區別

c 中把struct當成類處理,只不過和類的一點小區別是struct中訪問許可權預設是public,而類中訪問許可權預設是private 而在c中,struct是抽象資料型別 基於這個,會有以下的區別 1 c中定義的時候需要在前面加上struct,而c 中不用 2 c 把struct當成類處理,所以...

struct(在C與C 中的區別)

首先我承認沒有系統地學習過c 今天看到l的 我驚了下,struct怎麼搞得跟class有點相似,還有建構函式啊 查了下資料 struct關鍵字定義乙個結構體型別或乙個結構體型別的變數 具體內容點上面連線吧,我就寫幾點 樣例 struct1.cpp struct person family membe...

struct結構體在c和c 中的區別

很多次遇到這個struct的問題,今天在這裡簡單總結一下我的理解 一 struct在c 中的使用 1 單獨使用struct定義結構體型別 struct student stu1 struct student stu2 stu1.id 1 stu2.id 2 上面定義了乙個結構體型別struct st...