明晰class和struct之間的區別

2021-07-29 21:15:17 字數 2916 閱讀 2140

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++的設計有過程設計為中心向以資料組織為中心轉移。

struct和class的關係

一 預設繼承許可權。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理 二 成員的預設訪問許可權。class的成員預設是private許可權,struct預設是public許可權。除了這兩點,class和struct基本就是乙個東西。語法上...

struct和class的區別

1.值型別與引用型別 結構是值型別 值型別在堆疊上分配位址,所有的基型別都是結構型別,例如 int 對應system.int32 結構,string 對應 system.string 結構 通過使用結構可以建立更多的值型別 類是引用型別 引用型別在堆上分配位址 堆疊的執行效率要比堆的執行效率高,可是...

class和struct的區別

從語法上,在c 中 只討論c 中 class和struct做型別定義時只有兩點區別 一 預設繼承許可權。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理 二 成員的預設訪問許可權。class的成員預設是private許可權,struct預...