這個問題已經在C#/。Net上下文中提出過 。 程序員
如今,我想學習C ++中的結構和類之間的區別。 請討論技術差別以及在OO設計中選擇一個或另外一個的緣由。 ide
我將從一個明顯的區別開始: 函數
public:
或private:
:,則結構的成員默認爲public; 默認狀況下,類的成員是私有的。 我確信在C ++規範的晦澀之處能夠找到其餘差別。 學習
class A{ public: int i; }; class A2:A{ }; struct A3:A{ }; struct abc{ int i; }; struct abc2:abc{ }; class abc3:abc{ }; int _tmain(int argc, _TCHAR* argv[]) { abc2 objabc; objabc.i = 10; A3 ob; ob.i = 10; //A2 obja; //privately inherited //obja.i = 10; //abc3 obss; //obss.i = 10; }
這是在VS2005上。 spa
。 在類中,默認狀況下全部成員都是私有的,而在結構中默認狀況下全部成員都是公共的。 設計
對於結構,沒有像構造函數和析構函數這樣的術語,可是對於類編譯器,若是不提供,則會建立默認值。 指針
空類的Sizeof結構爲0字節,而空類的Sizeof爲1字節結構的默認訪問類型爲public。 一般應將結構用於分組數據。 code
類的默認訪問類型爲private,繼承的默認模式爲private。 應該使用一個類對數據和對該數據進行操做的方法進行分組。 對象
簡而言之,約定是在將數據分組時使用struct,而在咱們須要數據抽象甚至繼承的狀況下使用類。 繼承
在C ++中,除非明確取消引用,不然結構和類將按值傳遞。 在其餘語言中,類和結構可能具備不一樣的語義-即。 對象(類的實例)能夠經過引用傳遞,而結構能夠經過值傳遞。 注意:有與此問題相關的評論。 請參閱討論頁添加到對話。
C ++中struct和class關鍵字之間的區別在於,當在特定的複合數據類型上沒有特定的說明符時,默認狀況下struct或union是僅考慮數據隱藏的public關鍵字,而class是考慮程序隱藏的private關鍵字。代碼或數據。 老是有些程序員爲了代碼而使用struct來存儲數據和使用類 。 有關更多信息,請聯繫其餘來源。
從全部這些因素中,能夠得出結論,概念類很是適合表示現實世界的對象,而不是「結構」。很大程度上,由於類中使用的OOP概念在解釋現實世界場景時很是實用,所以更容易將它們合併爲現實。例如,默認繼承是結構的公共屬性,可是若是將此規則應用於現實世界,這是很荒謬的。可是在類中,默認繼承是private,這是更現實的作法。
不管如何,我須要證實的是,類是一個更普遍的,在現實世界中適用的概念,而結構是一個內部組織較差的原始概念(Eventhough結構遵循OOP概念,它們的含義不好)。
類是引用類型,結構是值類型。
當我說類是引用類型時,
基本上,它們將包含實例變量的地址。
例如:
Class MyClass { Public Int DataMember; //By default, accessibility of class data members //will be private. So I am making it as Public which //can be accessed outside of the class. }
在主要方法中
我可使用爲該類分配內存的新運算符建立該類的實例
並將其基地址存儲到MyClass類型變量(_myClassObject2)中。
Static Public void Main (string[] arg) { MyClass _myClassObject1 = new MyClass(); _myClassObject1.DataMember = 10; MyClass _myClassObject2 = _myClassObject1; _myClassObject2.DataMember=20; }
在上面的程序中,MyClass _myClassObject2 = _myClassObject1; 指令指示兩個MyClass類型的變量
並將指向相同的內存位置。
它基本上將相同的內存位置分配給另外一個相同類型的變量。
所以,若是咱們對MyClass類型的任何一個對象進行的任何更改都會對另外一個對象產生影響
由於二者都指向相同的存儲位置。
「 _myClassObject1.DataMember = 10;」 在此行,對象的兩個數據成員都將包含值10。
「 _myClassObject2.DataMember = 20;」 在此行,對象的數據成員都將包含值20。
最終, 咱們經過指針訪問對象的數據成員。
與類不一樣,結構是值類型。 例如:
Structure MyStructure { Public Int DataMember; //By default, accessibility of Structure data //members will be private. So I am making it as //Public which can be accessed out side of the structure. } Static Public void Main (string[] arg) { MyStructure _myStructObject1 = new MyStructure(); _myStructObject1.DataMember = 10; MyStructure _myStructObject2 = _myStructObject1; _myStructObject2.DataMember = 20; }
在上面的程序中
使用new運算符實例化MyStructure類型的對象
將地址存儲到MyStructure類型的_myStructObject變量中,並
使用「 _myStructObject1.DataMember = 10」將值10分配給結構的數據成員。
在下一行中
我聲明瞭另外一個MyStructure類型的變量_myStructObject2,並將_myStructObject1分配給它。
.NET C#編譯器在這裏建立_myStructureObject1對象的另外一個副本,並
將該內存位置分配給MyStructure變量_myStructObject2。
所以,不管咱們對_myStructObject1進行的更改如何,都永遠不會對MyStructrue類型的另外一個變量_myStructObject2產生影響。
這就是爲何咱們說結構是值類型。
所以,該類的直接基類是Object,而Structure的直接基類是ValueType,它從Object繼承。
類將支持繼承,而結構則不支持。
咱們怎麼說呢?
那是什麼緣由呢?
答案是班級。
它能夠是抽象的,密封的,靜態的和部分的,而且不能是私有的,受保護的和受保護的內部。