面試中偶有考官問道「
class
和struct
有什麼區別?」。回答大多千篇一律:嗯,
struct
中預設的訪問許可權是
public
,而class
中則是private
。其實這個回答並不完整。
為什麼c++中會存在兩個如此相似的關鍵字?其實
struct
的存在僅僅是為了保證
c++對
c的相容性罷了。如此說來,既然保留了
struct
,而struct
和class
起到的作用又是一樣的,為什麼要引入
class
關鍵字呢?從語法上來說這是沒有必要的,只是因為
class
這個單詞的意思能更好地貼合類這種具有封裝性的資料結構的實質罷了。不過隨著
template
的引入,
class
和struct
關鍵字就有了明顯的不同了。
首先,我們從
struct
關鍵字在c和
c++中的區別說開去。在
c的編譯器中,**
struct
label
; 只是定義了乙個結構體標籤
label
。要想在**中產生這個結構體的具體實現
t,必須採用
struct
labelt;
的形式,而不能使用如下語句
labelt;
這就是為什麼在
c程式中常常用
typedef來定義乙個
struct的原因了。但是上面的語句在
c++的編譯器中都是可行的:換而言之,c++中的
struct關鍵字能定義乙個結構體,而
c中的
struct關鍵字只能定義乙個結構體的標籤。
接下來讓我們拋開c,在
c++中**
class
和struct
關鍵字的不同。乙個很明顯的區別上面已經說過了:
struct
中預設的訪問許可權是
public
,而class
中則是private
。但是這並非全部。具體的區別如下: 1.
struct
中預設的訪問許可權是
public
,而class
中則是private;
2.當用
struct
關鍵字構建的類成為父類時,預設的繼承許可權為
public
;而當用
class
關鍵字構建的類成為父類時,預設的繼承許可權是
private;
3.在模板
template
的<>
中的型別定義僅僅支援
class
和typename
,並不支援
struct。《
inside the c++ object model
》中的例程如下:
template
<structtype>
struct
test
;
//以上編譯器會報錯,正確的語法如下:
template
<classtype>
struct
test
; 為什麼
template
不支援struct
?前面說了,
c++中保留
struct
僅僅是為了與
c的相容性的話,而模板設計的初衷就沒有想過與
c相容,所以拋棄
struct
關鍵字也是很自然的事情了。 4.
記憶體布局的不一致。在
c語言的時代,一些程式設計師常常將單一元素的陣列放到乙個
struct
的尾部,於是每個
struct object
就可以擁有可變大小的陣列了,**如下:
#include
#include
#include
struct
mumble
;
intmain()
看,很精巧的實現吧。不過到了
c++中,這可不一定對了。在c++中凡是處於同乙個
access section中的資料,一定會保證其中的資料以宣告的次序出現在記憶體中;但是多個
access section的資料在記憶體中的出現次序就不一定了。而在引入了繼承、虛函式後,這個問題就會更為複雜了。一定想在
c++的類中實現這種技巧?沒問題,把繼承、虛函式和多個
access section
都棄用吧。
C 中struct關鍵字和class關鍵字的區別
剛開始接觸 c 看到 中有struct關鍵字,還以為是用了結構體,結果後來發現 struct 和 class 一樣都用於類的定義,於是把兩者的差別記錄於此。一句話總結 兩者均可用於定義類,唯一的區別是兩者定義的類的預設訪問許可權有差別。其實比兩者差別更重要的是,我很好奇為什麼 c 中會存在兩個用於定...
struct與class關鍵字在定義類中的區別
struct關鍵字是從c語言中繼承過來的,class和struct均可定義類,用它們定義類的唯一差別在於預設的成員保護級別和預設的繼承保護級別 p57 第57頁,2.8 章節2.8 p485,15.2.5 預設情況下,struct的保護級別為public,而class的保護級別為private。下面...
C 中關鍵字Struct和Class的區別
struct和class的區別 今天這篇博文主要講解在c 中關鍵字struct和class的區別。這篇博文,將會系統的將這兩個關鍵字的不同面進行詳細的講解。從語法上來講,class和struct做型別定義時只有兩點區別 1.預設繼承許可權,如果不指定,來自class的繼承按照private繼承處理,...