class與struct
c++最初被稱為「c with class」,足見class在c++中的地位。在c++中我們可以用class自定義使用者資料型別,然而它還存在乙個類似的——struct,他們似乎有著太多的相同的特點與功能。
由於在設計c++時就考慮到要向下相容c,所以c++中的很多東西都能在c中找到,要談及struct就要從c談起。
c中struct的定義如下:
struct 結構名
;因為struct是一種資料型別,那麼就肯定不能定義函式,所以在面向c的過程中,struct不能包含任何函式,如下所示:
struct a
;如果出現下面的結構體定義,編譯器將報錯:
struct a;};
面向過程的程式設計認為,資料和資料操作是分開的。然而當struct進入物件導向的c++時,其特性也有了新發展,就拿上面的錯誤函式來說,在c++中就能執行,因為在c++中認為資料和資料物件是乙個整體,不應該分開,這就是struct在c和c++兩個時代的差別。
寫到這或許很多人就會有異或了:c++中的struct不就和class一樣了?是的 ,他們用起來差別不大,主要差別有以下幾點:
(1)關於使用大括號初始化
class和struct如果定義了建構函式,就不能用大括號進行初始化了;若沒有定義,struct可以用大括號初始化,而class只有在所有成員變數全是public的情況下,才可以用大括號進行初始化。
#include
using
namespace
std;
struct
sa ;
sadata1
=;//
程式正確
struct
sb
~ sb
() {}
};sb
data2
=; //
程式錯誤
class
ca ;
cadata3
=;//
正確class
cb
~ cb
() {}
};cb
data4
=;
//錯誤
class
cc
~ cc
() {}
private
: inta;
intb
; };
ccdata5
=;//
錯誤
以上**在vs2008下會提示
1>f:\程式\
繼承和多型(初)
\繼承和多型(初)
\test.cpp(21) : error c2552:
「data2」:
不能用初始值設定項列表初始化非聚合
1>f:\程式\
繼承和多型(初)
\繼承和多型(初)
\test.cpp(41) : error c2552:
「data4」:
不能用初始值設定項列表初始化非聚合
1>f:\程式\
繼承和多型(初)
\繼承和多型(初)
\test.cpp(53) : error c2552:
「data5」:
不能用初始值設定項列表初始化非聚合
關於 這種初始化的不同,在新的標準c++中已經不存在了,因為新標準制定了統一的初始化語法,**如下:
//類初始化cc
;//
相當於c++0x
中的:c c(0,0);
//陣列初始化
int*a=
newint
[3] ;
//成員變數初始化
class
x{}
};
//vector
容器初始化
vector
<
string
>
vs=;
//map
容器初始化
mapsingers
= ,
};
雖然大括號的初始化方式在新標準中得到統一,但是現在也僅僅是標準,在新標準執行之前這種不同仍然存在。
(2)關於預設許可權訪問
class中預設成員訪問許可權是private,而struct的預設訪問許可權是public,具體**如下:
struct
sa ;
class
ca ;
sadata1
=;ca
data2
=;cout
<<
data1.a
<<
data2.a
<<
endl
;1>f:\程式\
繼承和多型(初)
\繼承和多型(初)
\test.cpp(94) : error c2552:
「data2」:
不能用初始值設定項列表初始化非聚合
(3)關於繼承方式
class中預設繼承方式是private,而struct的預設繼承方式是public,具體**如下:
structsa;
structd1:
sa;
classca;
classd2:
ca;d1a
;d2b;
cout
< a<< endl ;cout < a<< endl ;雖然感覺struct是多餘的,但考慮到「對c相容」就將struct保留了下來,並做了一些擴充套件使其更適合物件導向,所以c++中的struct再也不是c中的那個了。 而兩者最大的區別就在於思想上,c語言程式設計單位是函式,語句是程式的基本單元。而c++語言的程式設計單位是類。從c到c++的設計有過程設計為中心向以資料組織為中心轉移。 一 預設繼承許可權。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理 二 成員的預設訪問許可權。class的成員預設是private許可權,struct預設是public許可權。除了這兩點,class和struct基本就是乙個東西。語法上... 1.值型別與引用型別 結構是值型別 值型別在堆疊上分配位址,所有的基型別都是結構型別,例如 int 對應system.int32 結構,string 對應 system.string 結構 通過使用結構可以建立更多的值型別 類是引用型別 引用型別在堆上分配位址 堆疊的執行效率要比堆的執行效率高,可是... 從語法上,在c 中 只討論c 中 class和struct做型別定義時只有兩點區別 一 預設繼承許可權。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理 二 成員的預設訪問許可權。class的成員預設是private許可權,struct預...struct和class的關係
struct和class的區別
class和struct的區別