前言 G'{4ec0<{
#{ `(;83
熟悉C的程序员都知道union(联合体)的用法,利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"->"来直接访问。在C++出现后,它继承了union并保留了其在C中的特性。但是在C++中的union又有了新的扩展,这需要大家了解,要不然你会感到费解和迷惑。下面我讲两点。 (hd2&mSy
q1NAKcA<U
一、在union中存储对象 bX5>qqB]
l4r09"S|V
在C中union中可以存储任意类型的内置数据类型,那么在C++中union是否可以存储对象呢?还是让我们看一个例子吧,这比任何言语都能说明问题,不是吗? 4V<s"
Ej6vGC.,
#pragma warning(disable : 4786) H$1R\rE`
#include L
F Z
using namespace std; E(TL+o
b.C!4^
class TestUnion \7gLk:
{ 7M^!t X
public: MlS<txFPS
TestUnion(long l):data_(l) j<wg>O:s%r
{ JsVW:8QO~
}; 1(rH5z'F
int data_; =$Xdn'
}; vxZz9+UbF
(AXSQI~y
typedef union _tagUtype_ KcNEB_i
{ \gj@O5rG P
TestUnion obj; }2V|B4
}UT; 3x'BMAA+
V><5N;w
int main (void) &W`yHQ"JY
{ rJ9a@n,
return 0; "E8-76n
} DghX(rs_
V:My1R0
<E$5LP;:
这样不行,union中不可以存储TestUnion类的对象,但在C中union可以存储struct呀,为什么不能存储类的对象呢?很简单,请问,在C中union可以存储带有构造函数的struct吗?对了,在C中的struct是没有构造函数的。所以如果C++中union可以存储有构造函数的类的对象就不太符合逻辑,那不是说C++和C完全兼容吗?不错,正因为这一点,C++中union不可以存储有构造函数的类的对象,但是可以存储不带构造函数的类的对象,这样就和C保持一致了,不想信你试试。对TestUnion类的声明进行如下修改: 'S@C,x%2,
Qmzj1e$6x
class TestUnion 65s|gfu/
{ G~u94rw|:
public: 3H@TvV/;f
int data_; 2-]gHAw%
}; h"]v+u`!SM
TQ>kmHWf/
再进行编译,一切OK!。但是这样却失去了C++的构造初始化特性,这样做是没有任何意义的,我只是在说其在C++中的语义,并不是推荐大家使用(绝对不推荐)。但是我们可以在union中存储对象的指针,从而引用不同的对象类型。不用我再多说了吧,大家还是试试吧! CKNH/[ZR,
m3P%E8<Q#
二、类中union的初始化 YG"P:d;s
I)Lg=n$
由于union的共享内存特点,我们可以使我们的类存储不同的型别而不浪费内存空间,在类中我们可以声明一个union存储不同型别的指针,示例如下: :6N{~ [:4
4vp,izNW
#pragma warning(disable : 4786) !=|3^A
#include OHM.xw*?.
1th|n
using namespace std; B.0(}@
yxLGseD
class TestUnion r?[PIf
{ '1^\^)&q
enum StoreType{Long,Const_CharP}; U#d",s
union C4TJS,!1rH
{ 7cY_=X-?Y
const char* ch_; tezsoR!.ak
long l_; T~=NY,n
} data_; 2vu"PeU9
StoreType stype_; .2[>SI
TestUnion(TestUnion&); `!>zYcmT
TestUnion& operator=(const TestUnion&); :=UeYm
@
public: Lt|k}p@]
TestUnion(const char* ch); K,?M5n '
TestUnion(long l); I_'vVbK+>
operator const char*() const {return data_.ch_;} %L<VnY#%u
operator long() const {return data_.l_;} jO<K0cc
}; BLuILE:$
s1:UCv-%
TestUnion::TestUnion(const char* ch):data_.ch_(ch),stype_(Const_CharP) }qi6K-,oU
{ qW$IpuK
} )Xl/|YD
kO~xE-(=
TestUnion::TestUnion(long l):data_.l_(l),stype_(Long) >2vl & (
{ #B;` T[
} Uj1^?d+b
=36vsps=
int main (void) k "'q
{ !gW$A-XD
TestUnion pszobj("yuankai"); ce1KUwo]
TestUnion lobj(1234); Y}(v[QGV
cout<(pszobj)< cout< :-ax5,J> q
return 0; ov*zQP
} &