2011-04-20 123 views
4

可能重複:
What are the differences between struct and class in C++爲什麼C++有類和結構體?

如果結構和類之間的唯一區別是默認訪問說明符(在C++),那麼爲什麼C++也有課嗎?

+0

看到[結構與類](http://stackoverflow.com/questions/2750270/cc-struct-vs-class) – mbx 2011-04-20 20:47:56

+0

http://stackoverflow.com/questions/543515/structs-vs-classes- in-c似乎可能是相關的,等等。 – 2011-04-20 20:48:09

+0

@格雷格我不要求什麼差別... – Lockhead 2011-04-20 20:51:54

回答

12

首先,它與C向後兼容。012第二(也是更重要的一點),它有助於描述你的意圖。標準約定是POD應該用struct表示,並且數據和行爲的集合應該用class表示。

+0

那麼爲什麼類結構允許在結構中使用類運算符,比如運算符重載?這不會破壞兼容性嗎? – Lockhead 2011-04-20 20:53:23

+1

在這種情況下,它是關於* convention *的。通過這個和許多其他方式,C++可以讓你做很多事情,不管它們是不是好主意。 – Joe 2011-04-20 21:04:00

+2

@MisterSir - no,**向後**兼容性意味着使用結構的C代碼將在C++下按預期進行編譯和工作。你的例子(結構與行爲)是一個C++代碼,當然它不會在C下工作,因爲C++不能保證**轉發**兼容性 – davka 2011-04-20 21:06:40

1

你想要類具有默認的訪問說明符設計面向對象的層次結構時,是私人的,但結構需要有默認的訪問說明符是公衆C.

-1

保持向後兼容性與C兼容性C沒有課,但它有結構。

請注意,這僅僅是.c文件文本中的「向後兼容性」。在C++中,結構實際上是類,默認曝光度爲public,而不是默認曝光度private

class Bob { 
    // I haven't overridden the exposure, so it's private 
    int age; 
    int height; 

    public: 
    Bob(); 

}; 


struct Bob { 
    // I haven't overridden the exposure, so it's public 
    int age; 
    int height; 

    // note the constructor defaults to the "default" constructor. 
}; 

甲真正的C樣式結構被定義爲這樣

extern "C" { 
    struct Bob { 
    int age; 
    int height; 
    }; 
} 

在這種情況下,年齡變得更加的「偏移量0」和高度變更的「偏移+別名(別名而不是被它可以在任何需要的方式實現的概念領域的sizeof(int)的+對準內存管理邊界)。

+0

-1廢話; 'extern「C」'用於指定鏈接。它不是*「放入C語言」開關。例如'extern「C」{struct T {T(){}}; }'是完全有效的。 (您的答案的其餘部分是正確的。) – 2011-04-24 16:36:35

+0

我的文章中聲明「放入C語言」的部分在哪裏?我只是說「一個真正的C風格結構是這樣定義的......」 – 2011-04-24 16:39:40

+0

是的,這是不正確的。你仍然在聲明+定義一個C++結構體。 (雖然我現在看到,也許你只是想談論C兼容性?) – 2011-04-24 16:43:08

0

至於其他人已經發布,主要的區別是默認的保護水平(即公共或私營)。但是,這也是一個很好的指示實際使用的 數據結構。例如,有時您可能需要一個輕量級結構,類似於java bean。在這種情況下,你可能只是:

class point { 
public: 
    float x, y; 
}; 

這是不太清楚你的意圖是什麼:

struct point { 
    float x, y; 
}; 

它,你不使用任何C++特性在這裏,對明顯。我可能會注意到第二個例子是不好的代碼,因爲有人沒有提供getter和setter。