在 C++ 中class 和 struct 只有兩點主要區別:
- 預設繼承許可權。預設情況下,class的繼承是以private來繼承而struct則是按照public進行繼承。
- 成員的預設存取權限。class的成員預設是private許可權,struct預設是public許可權。
而其它的特性,struct和class基本上,甚至嚴格來說是一樣的:
01 |
//一個不常見的樣本,將 struct 直接改為class也能編譯通過。 |
13 |
bar(int a){ y = a;}//帶參數的建構函式 |
16 |
virtual void func1() = 0; //純虛函數 |
19 |
struct foo: protected bar // 繼承 |
25 |
void say(string msg) {cout<<msg<<endl;} |
26 |
virtual int func2();//虛函數 |
可以看到:
- 都可以有成員函數:struct可以包含和class中一樣的建構函式,解構函式,重載的運算子,友元類,友元結構,友元函數,虛函數,純虛函數,靜態函數;
- 儘管預設存取權限不同,但都可以擁有public/private/protected修飾符;
- 都可以進行複雜的繼承和多重繼承,一個struct可以繼承自一個或多個class,反之亦可。
- 注意這裡與C語言並不相同,C 語言中的 struct 從本質上來說只是一個封裝資料的文法機制。
在 Google C++編程風格指南 中也聲稱:
僅當叧有資料時使用 struct,其它一概使用 class。
在 C++中,關鍵字struct和 class 幾乎含義等同,我們為其人為添加語義,以便為定義的資料類型合理選擇使用哪個關鍵字。
struct 被用在僅包含消極對象( passive objects)上,可能包括有關聯的常量,但沒有存取資料成員外的函數功能,而存取功能通過直接存取實現而無需方法調用,這兒提到的方法是指只用於資料 成員的,如建構函式、解構函式、Initialize()、Reset()、Validate()。
如果需要更多的函數功能,class 更適合,如果不確定的話,直接使用 class。
如果不 STL結合,對於仿函數(functors)和特性(traits)可以不用 class 而是使用struct。
雖然一些C++專家聲稱可以不再使用struct關鍵字,而可以總是使用class { public:}來代替。但事實上,struct仍在代碼中廣泛使用,開發人員常使用struct(部分也是由於C語言的影響)來表示一個輕量級的並不需 要嚴格封裝的記錄,例如,一個寫入檔案的記錄或資料庫表結構就常用struct來聲明;而class則主要是用來進行物件導向編程。
在一般情況下,仍必須使用struct結構的主要原因是:
當然,有時使用struct可以讓代碼看起來更簡潔:
1 |
struct Compare { bool operator() { ... } }; |
2 |
std::sort(collection.begin(), collection.end(), Compare()); |
C++ 中的進階特性和文法細節太多,因此遵循一定的編程規範還是很有必要的。