C union 使用總結

2021-08-25 09:33:34 字數 986 閱讀 3846

以前寫**,很少使用union,所以在潛意識中,經常將其忽略。最近要寫個生成一段資料的程式,資料型別有兩種,一種保護的資料多些,另一種只包含第一種中的部分資料。因為潛意識中沒有union,所以開始也沒想到用union來實現。給同事討論時,同事提示用union時,自己才想起來,c++中還有union。

依次為契機,就在網上查了些介紹union的資料,給自己補補課。下面總結了一下使用union的幾個注意點,深層次的東西就不去**了。

1、共享記憶體

也就是共享起始位址。union變數中,可以包含union中的任何乙個成員,但是該union變數的起始位址是固定的。

2、取最大成員的空間

既然union變數可以包含union中的任何乙個成員,所以分配的空間必須確保能放得下最大的變數,這一點也比較容易理解。

3、成員類不可以有建構函式

此處就不對struct和class作區別了。為什麼不能包含呢,此處借鑑了:

中的思想。不過,本人還是想在此處再說一遍,也為了加深我的記憶。

為什麼不允許成員類有建構函式呢,因為union也有難處,呵呵。如果成員有建構函式的話,在定義union(假設其中有類和基本型別的成員)變數的時候就不知道該不該去呼叫類的建構函式?如果呼叫了,而只使用了union中的基本型別的成員,顯然建構函式的呼叫是多餘的;如果沒調,則類中的資訊並沒有初始化,如果使用,就會造成問題。還有,假如建構函式中分配了資源,在union變數被銷毀的時候,也會去呼叫析構函式,釋放資源?再假如,union中的多個類成員的建構函式中都分配了資源,union變數被銷毀的時候,會分別呼叫每個成員析構函式,去釋放資源麼?

這樣只會讓union趨於無限複雜。

還有,包含建構函式/析構函式/拷貝建構函式/賦值運算子/虛函式的類成員,在union中都是不被允許的。

4、union可以有建構函式

個人覺得這可以算得上語言包容性的乙個體現。union和struct、class一樣,也是一種型別,既然是一種型別,就可以有建構函式,來構造該型別的物件。雖然這麼做是允許的,但該做法並不被推薦。

C union 使用總結

以前寫 很少使用union,所以在潛意識中,經常將其忽略。最近要寫個生成一段資料的程式,資料型別有兩種,一種保護的資料多些,另一種只包含第一種中的部分資料。因為潛意識中沒有union,所以開始也沒想到用union來實現。給同事討論時,同事提示用union時,自己才想起來,c 中還有union。依次為...

C union 使用總結

以前寫 很少使用union,所以在潛意識中,經常將其忽略。最近要寫個生成一段資料的程式,資料型別有兩種,一種保護的資料多些,另一種只包含第一種中的部分資料。因為潛意識中沒有union,所以開始也沒想到用union來實現。給同事討論時,同事提示用union時,自己才想起來,c 中還有union。依次為...

EJunGrid使用總結

1 1。0版沒有實現垂直方向上的對齊,procedure tobgui reportdesign.griddrawcelltext acanvas tcanvas const arect trect const acoord tpoint agrid tzjgrid const text strin...