2013-01-23 19 views
2

類和結構之間有一個區別(據我所知),struct默認爲publicclass默認爲private。然後我才知道有一種類似的數據類型,它也以類似的方式使用,即unionunion不能用作繼承的基礎class(我不知道這意味着什麼,但我仍然接受它)。在哪裏可以使用union,class和struct?

我想知道是否有一些特殊的情況下,當struct/union/class,或者他們可以互換使用(除了我入伍的情況下)?請告訴我,如果我在某個地方錯了。 Regards

+0

http://stackoverflow.com/questions/7950689/when-to-use-a-union-and-when-to-use-a-structure – acraig5075

+0

工會與其他兩個人有很大的不同。 – chris

+2

如果你沒有一個很好的理由來使用'union',那就不要。 – aschepler

回答

4

我的classstructunion使用如下:

  • class爲有行爲的對象。
  • struct用於無源數據。
  • union對於需要以不同類型訪問不同數據的非常特殊情況。

我在Google C++ Style guide很久以前閱讀本(除union點),我是繼自那以後。

使用structs來攜帶被動數據(沒有行爲附加到對象的對象)具有成員默認公開的優點,因此可以在沒有Getters和Setter的情況下訪問它們。如果某些成員數據在分配之前需要檢查/修改,或者某些成員數據需要在得到之前進行計算/修改,恕我直言,他們需要一個Setter/Getter對,而對象是class而不是struct

對於union類型,我發現它對於某種數據結構,需要一些怪異訪問成員,或需要一些成員能夠在某些情況下其他類型進行治療是有用的。例如,一個三維向量或IP地址:

union 3DVector 
{ 
    double x, y, z; 
    double vector[3]; 
} v; 

// Acess members with name 
v.x = 6.0; v.y = 7.0; v.z = 8.0; 
// Acess members as a vector 
Normalize(v.vector); 

union IPAddress 
{ 
    int binary; 
    char octet[4]; 
} ip; 

// Acess the binary address 
std::cout << std::hex << ip.binary << '\n'; 
// Print in a human-readable form 
std::cout << static_cast<int>(ip.octet[0]) << '.' 
      << static_cast<int>(ip.octet[1]) << '.' 
      << static_cast<int>(ip.octet[2]) << '.' 
      << static_cast<int>(ip.octet[3]) << '\n'; 

上述功能可以實現運算符重載和轉換操作符,但union方法看起來整齊我。

union S能也作爲模板,並可以有構造函數/析構函數,這可能是序列化的目的(所有類型的對象沒有)有用:

template <typename T> union Serializer 
{ 
    Serializer(const T &o) : object(o) {} 
    T object; 
    char binary[sizeof(T)]; 
}; 

SomePODObject obj; // Only POD objects please! 
Serializer s(obj); 
SendBuffer(s.binary); 
+1

使用'union'進行二進制序列化幾乎總是平臺可變性和其他原因的一個壞主意。爲了便於序列化整數,使用按位技巧(簡單)。要序列化浮點數,請使用'ldexp'和family加上您正在序列化到/從(痛苦)的精確浮點數表示的知識。要序列化對象,請使用成員的序列化。 – Steve314

2

聯合和類或結構是完全不同的。 union同時有好幾件事,可以說它既可以是一個字符數組也可以是一個整數,而一個類或結構是封裝一些邏輯連接信息的唯一一件事,以及可選的用於操縱它的邏輯。工會和其他兩個案例的使用情況完全不同。我通常使用一個結構,當我只存儲一些數據,而如果我還需要一些相關的邏輯(即我需要添加方法),我使用一個類。

+0

你什麼時候使用工會?你將如何支持你的陳述:「union是一個用戶定義的數據或類類型,在任何時候,它只包含一個來自其成員列表的對象(儘管該對象可以是數組或類類型) 。「?我從http://msdn.microsoft.com/en-us/library/5dxy4b7b(v=vs.80).aspx –

+0

@IvayloStrandjev得到這是未定義的行爲。 Q被標記爲C++,而不是C. –

+1

@LuchianGrigore事實上,我使用這個'hack'來找到機器上的endianess。我不確定你評論的第二部分是什麼意思。在'C'中沒有類的東西,我也嘗試給出我在何時使用類以及何時在我的答案中使用struct的觀點。 –

1

我從來沒有使用過工會。如果你最終看到這個,你最好嘗試提升變體。唯一可以接受的情況是我們真的需要對內容進行深度控制,比如自定義序列化。但在很多情況下我會用完這個。

此外,結構僅用於存儲數據。如果您需要添加任何函數/方法,請將其轉換爲類。

0

有一些地方我可以使用structclass

  • 如果我要定義一個包含純虛函數的接口類型。這與struct默認爲public的概念是一致的。
  • 純數據類型,其中沒有任何行爲附加到該類型。
  • 政策或特質類型,作爲個人偏好。

union既不是classstruct。我只是在C語言中使用它們來創建區分或變體類型的內存時纔是溢價。在C++中,我在典型應用程序中看不到很多優勢,但仍可能用於嵌入式或低內存應用程序。

0

當訪問寄存器時,通常結構和聯合在C中一起使用。一個結構可以定義每一位,並允許單獨設置寄存器中的每一位。聯盟將允許同時更改或訪問所有位。

即使在C++中,也需要一種方法來設置硬件並寫入芯片的寄存器。