前言 l?1!h2z%
Y-c~"#
熟悉C的程序员都知道union(联合体)的用法,利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"->"来直接访问。在C++出现后,它继承了union并保留了其在C中的特性。但是在C++中的union又有了新的扩展,这需要大家了解,要不然你会感到费解和迷惑。下面我讲两点。 ?-84_i
XP^6*}H.*
一、在union中存储对象 7~Ga>BK
1=a}{)0h
在C中union中可以存储任意类型的内置数据类型,那么在C++中union是否可以存储对象呢?还是让我们看一个例子吧,这比任何言语都能说明问题,不是吗? ^[Er%yr0
k"7eHSy,
#pragma warning(disable : 4786) 4vQHr!$Ep
#include Fi/G, [q
using namespace std; |O9=C`G_
Mqtp}<*@-
class TestUnion +r!h* 4
{ ?W|IC8~d')
public: fDqXM;a"
TestUnion(long l):data_(l) #Fd([Zx#.
{ bgK(l d`
}; KJ)&(Yx
int data_; _Usg`ax-
};
*&0Hz{|
u.=;A#
typedef union _tagUtype_ J|
'(;Ay4u
{ ed*AU,^@v
TestUnion obj; X[~CLKH(
}UT; g[jZ A[[
V6{xX0'b*m
int main (void) =|%T E
{ w;$+7
return 0; JAz;_wS(k
} -N(MEzAE
5l}h8So4
*n'xS L
这样不行,union中不可以存储TestUnion类的对象,但在C中union可以存储struct呀,为什么不能存储类的对象呢?很简单,请问,在C中union可以存储带有构造函数的struct吗?对了,在C中的struct是没有构造函数的。所以如果C++中union可以存储有构造函数的类的对象就不太符合逻辑,那不是说C++和C完全兼容吗?不错,正因为这一点,C++中union不可以存储有构造函数的类的对象,但是可以存储不带构造函数的类的对象,这样就和C保持一致了,不想信你试试。对TestUnion类的声明进行如下修改: g\)z!DQ]
R,bcE4WR"
class TestUnion iP%=Wo.
{ )\;r
V';
public: 7&)F;;H
int data_; k9xKaJ%1
}; 6v#G'M#r
*]6dV'
再进行编译,一切OK!。但是这样却失去了C++的构造初始化特性,这样做是没有任何意义的,我只是在说其在C++中的语义,并不是推荐大家使用(绝对不推荐)。但是我们可以在union中存储对象的指针,从而引用不同的对象类型。不用我再多说了吧,大家还是试试吧! W8NA.
^e,RM_.
二、类中union的初始化 i?/?{p$#a-
`7_LJ
\>I
由于union的共享内存特点,我们可以使我们的类存储不同的型别而不浪费内存空间,在类中我们可以声明一个union存储不同型别的指针,示例如下: ~&:R\
eFI4(Y
#pragma warning(disable : 4786) \(FDR
#include ]c2| m}I{:
OJ 5 !+#>
using namespace std; &zcjU+n
uP]o39b;V
class TestUnion rfi`Bp
{ FO=1P7
enum StoreType{Long,Const_CharP}; uCfp+
union sK?-@
{ j2M(W/_
const char* ch_; U9 *2< c
long l_; Ohag%<1#
} data_; N=wy)+
StoreType stype_; y}HC\A77uD
TestUnion(TestUnion&); n5/Tn7hY
TestUnion& operator=(const TestUnion&); ?|GxVOl
public: Dg+d=I?
TestUnion(const char* ch); J"%}t\Q
TestUnion(long l); T_[\(K`w!
operator const char*() const {return data_.ch_;}
]:fCyIE
operator long() const {return data_.l_;} & }}WP:U
}; :Qo
30E v"
TestUnion::TestUnion(const char* ch):data_.ch_(ch),stype_(Const_CharP) ji
-1yX
{ 8k^y.B
} ~{G:,|`
c.Z4f7
TestUnion::TestUnion(long l):data_.l_(l),stype_(Long) 9 lJj/
{ [B @j@&
} ug"<\"
\q'fB?bS^
int main (void) )N6[rw<