前言 T7eo_Mn
2J;h}/!H
熟悉C的程序员都知道union(联合体)的用法,利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"->"来直接访问。在C++出现后,它继承了union并保留了其在C中的特性。但是在C++中的union又有了新的扩展,这需要大家了解,要不然你会感到费解和迷惑。下面我讲两点。 MqXN,n+`k
SooSOOAx[
一、在union中存储对象 Z/=x(I0
Pyc/6~?
在C中union中可以存储任意类型的内置数据类型,那么在C++中union是否可以存储对象呢?还是让我们看一个例子吧,这比任何言语都能说明问题,不是吗? I~lX53D
(dO, +~
#pragma warning(disable : 4786) ,@2d<d]
#include >SA?lG8f%
using namespace std; E]PHO\f-m}
7T
\}nX1
class TestUnion CrHH Ob
{ a}l^+
public: !@E=\Sm8EV
TestUnion(long l):data_(l) RH+3x7l
{ 7o?6Pv%HJC
}; fDo )~t*~
int data_; Bor _Kib
}; ,]e!OZ[$m
e6{}hiM
typedef union _tagUtype_ 8E`rs)A
{ Yrp
WGK520
TestUnion obj; U[9`:aV;
}UT; =8`,,=P^
vluA46c
int main (void) @A(*&PU>j
{ HpI[Af}l
return 0; Mfjj+P
} ,ZyTYD|7
<F!On5=W*
qG.HJD
这样不行,union中不可以存储TestUnion类的对象,但在C中union可以存储struct呀,为什么不能存储类的对象呢?很简单,请问,在C中union可以存储带有构造函数的struct吗?对了,在C中的struct是没有构造函数的。所以如果C++中union可以存储有构造函数的类的对象就不太符合逻辑,那不是说C++和C完全兼容吗?不错,正因为这一点,C++中union不可以存储有构造函数的类的对象,但是可以存储不带构造函数的类的对象,这样就和C保持一致了,不想信你试试。对TestUnion类的声明进行如下修改: <TmMUA)`}
3QSP](W-(
class TestUnion yRaB\'
{ T1ZAw'6(K
public: wPTXRq%
int data_; >W[8wR
}; tiJY$YqA
>jU.R;H5
再进行编译,一切OK!。但是这样却失去了C++的构造初始化特性,这样做是没有任何意义的,我只是在说其在C++中的语义,并不是推荐大家使用(绝对不推荐)。但是我们可以在union中存储对象的指针,从而引用不同的对象类型。不用我再多说了吧,大家还是试试吧! .L'>1H]B
OgjSyzc
二、类中union的初始化 QjMH1S
!%n3_tZC
由于union的共享内存特点,我们可以使我们的类存储不同的型别而不浪费内存空间,在类中我们可以声明一个union存储不同型别的指针,示例如下: &i*/}OZz
;RNU`Ip
#pragma warning(disable : 4786) d*ch.((-
#include Y85M$]e,
'Dyt"wfo
using namespace std;
:Rc>=)<7
]c,ttS_
class TestUnion h32QEz-+
{ ,a& N1G.
enum StoreType{Long,Const_CharP}; 3B:U>F,]4
union ML?%s`
{ SBo>\<@
const char* ch_; 5I9~OJ>
long l_; )`?Es8uW
} data_; B:dk>$>uQ
StoreType stype_; ! 9B| `
TestUnion(TestUnion&); D. !m*oq
TestUnion& operator=(const TestUnion&); 4;@|tC|u
public: i_?";5B"
TestUnion(const char* ch); y\&GPr
TestUnion(long l); fNOsB^Y
operator const char*() const {return data_.ch_;} t b5k|
operator long() const {return data_.l_;} kW>Q9Nc=V
}; ](yw2c;me
T-x1jC!B'
TestUnion::TestUnion(const char* ch):data_.ch_(ch),stype_(Const_CharP) sev^
{ Dpp3]en.
} w7NJ~iy
ed$g=qs>
TestUnion::TestUnion(long l):data_.l_(l),stype_(Long) kylR)
{ 7:x%^J+
} B,?Fjot#m
uKF?UXc
int main (void) HlEp
Dph%
{ e<s56<3j
TestUnion pszobj("yuankai"); 1'tagv?
TestUnion lobj(1234); y\ L$8BSL
cout<(pszobj)< cout< e R"XXF0u
return 0; g'G% BX
} e _\]Q-
&