C ++中的struct和class有什麼區別?

這個問題已經在C#/。Net上下文中提出過程序員

如今,我想學習C ++中的結構和類之間的區別。 請討論技術差別以及在OO設計中選擇一個或另外一個的緣由。 ide

我將從一個明顯的區別開始: 函數

  • 若是您未指定public:private: :,則結構的成員默認爲public; 默認狀況下,類的成員是私有的。

我確信在C ++規範的晦澀之處能夠找到其餘差別。 學習


#1樓

  1. 默認狀況下,結構的成員是公共的,而默認狀況下,類的成員是私有的。
  2. 從另外一個結構或類的結構的默認繼承是公共的。從另外一個結構或類的結構的默認繼承是私有的。
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


#2樓

  • 。 在類中,默認狀況下全部成員都是私有的,而在結構中默認狀況下全部成員都是公共的。 設計

    1. 對於結構,沒有像構造函數和析構函數這樣的術語,可是對於類編譯器,若是不提供,則會建立默認值。 指針

    2. 空類的Sizeof結構爲0字節,而空類的Sizeof爲1字節結構的默認訪問類型爲public。 一般應將結構用於分組數據。 code

    類的默認訪問類型爲private,繼承的默認模式爲private。 應該使用一個類對數據和對該數據進行操做的方法進行分組。 對象

    簡而言之,約定是在將數據分組時使用struct,而在咱們須要數據抽象甚至繼承的狀況下使用類。 繼承

    在C ++中,除非明確取消引用,不然結構和類將按值傳遞。 在其餘語言中,類和結構可能具備不一樣的語義-即。 對象(類的實例)能夠經過引用傳遞,而結構能夠經過值傳遞。 注意:有與此問題相關的評論。 請參閱討論頁添加到對話。


#3樓

C ++中structclass關鍵字之間的區別在於,當在特定的複合數據類型上沒有特定的說明符時,默認狀況下structunion是僅考慮數據隱藏的public關鍵字,而class是考慮程序隱藏的private關鍵字。代碼或數據。 老是有些程序員爲了代碼而使用struct來存儲數據和使用 。 有關更多信息,請聯繫其餘來源。


#4樓

從全部這些因素中,能夠得出結論,概念類很是適合表示現實世界的對象,而不是「結構」。很大程度上,由於類中使用的OOP概念在解釋現實世界場景時很是實用,所以更容易將它們合併爲現實。例如,默認繼承是結構的公共屬性,可是若是將此規則應用於現實世界,這是很荒謬的。可是在類中,默認繼承是private,這是更現實的作法。

不管如何,我須要證實的是,類是一個更普遍的,在現實世界中適用的概念,而結構是一個內部組織較差的原始概念(Eventhough結構遵循OOP概念,它們的含義不好)。


#5樓

類是引用類型,結構是值類型。
當我說類是引用類型時,
基本上,它們將包含實例變量的地址。

例如:

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類型的變量

  1. myClassObject1
  2. myClassObject2

並將指向相同的內存位置。
它基本上將相同的內存位置分配給另外一個相同類型的變量。

所以,若是咱們對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繼承。
類將支持繼承,而結構則不支持。

咱們怎麼說呢?
那是什麼緣由呢?
答案是班級。

它能夠是抽象的,密封的,靜態的和部分的,而且不能是私有的,受保護的和受保護的內部。

相關文章
相關標籤/搜索