C++ struct和class的區別

來源:互聯網
上載者:User

在 C++ 中class 和 struct  只有兩點主要區別:

  • 預設繼承許可權。預設情況下,class的繼承是以private來繼承而struct則是按照public進行繼承。
  • 成員的預設存取權限。class的成員預設是private許可權,struct預設是public許可權。

而其它的特性,struct和class基本上,甚至嚴格來說是一樣的:

01 //一個不常見的樣本,將 struct 直接改為class也能編譯通過。
02 //編譯環境為 GCC 4.4.1
03 #include <iostream>
04 #include <string>
05 using namespace std;
06  
07 struct bar
08 {
09     private: // 存取權限修飾符
10         int y;
11     public:
12         bar(){}; //無參建構函式
13         bar(int a){ y = a;}//帶參數的建構函式
14         ~bar(); //虛構函數
15         void say();
16         virtual void func1() = 0; //純虛函數
17 };
18  
19 struct  foo: protected bar // 繼承
20 {
21     private:
22           int x;
23     public:
24          foo(){};
25          void say(string msg) {cout<<msg<<endl;}
26          virtual int func2();//虛函數
27  
28 };
29  
30 int main() {
31     return 0;
32 }

可以看到:

  • 都可以有成員函數: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結構的主要原因是:

  • 開發維護遺留系統。
  • 需要與傳統的API進行通訊。

當然,有時使用struct可以讓代碼看起來更簡潔:

1 struct Compare { bool operator() { ... } };
2 std::sort(collection.begin(), collection.end(), Compare());

C++ 中的進階特性和文法細節太多,因此遵循一定的編程規範還是很有必要的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.