前言 tg#d.(
9'I$8Su
熟悉C的程序员都知道union(联合体)的用法,利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"->"来直接访问。在C++出现后,它继承了union并保留了其在C中的特性。但是在C++中的union又有了新的扩展,这需要大家了解,要不然你会感到费解和迷惑。下面我讲两点。 $?M$^ -(e
mgL{t"$c
一、在union中存储对象 D@iE 2-n&V
(V:)`A_-
在C中union中可以存储任意类型的内置数据类型,那么在C++中union是否可以存储对象呢?还是让我们看一个例子吧,这比任何言语都能说明问题,不是吗? +h?Rb3=S
8;+dlWp
#pragma warning(disable : 4786) _WB*ArR
#include CWx_9b zk
using namespace std; 0m>?-/uDx
o7^u@*"F
class TestUnion Hr}pO"%
{ zLS=>iLD{
public: rpn&.#KS
TestUnion(long l):data_(l) - D^.I
{ +|c1G[Jh
}; K=Y{iHn
int data_; ~H\1dCW
}; #Ab,h#f*7
&C&?kS(
typedef union _tagUtype_ &|#z" E^-
{ 34s>hm=0.
TestUnion obj; d.:.f_|
}UT; a$2WL g,
VcpN
PU6
int main (void) _a&Mk
{ <v+M ~"%V
return 0; OtD!@GQ6
} F0 ^kUyF|
E
As1
=
A>Y!d9]ti
这样不行,union中不可以存储TestUnion类的对象,但在C中union可以存储struct呀,为什么不能存储类的对象呢?很简单,请问,在C中union可以存储带有构造函数的struct吗?对了,在C中的struct是没有构造函数的。所以如果C++中union可以存储有构造函数的类的对象就不太符合逻辑,那不是说C++和C完全兼容吗?不错,正因为这一点,C++中union不可以存储有构造函数的类的对象,但是可以存储不带构造函数的类的对象,这样就和C保持一致了,不想信你试试。对TestUnion类的声明进行如下修改: 0?/vcsO
dePI&z:
class TestUnion 2& ZoG%)
{ ?I}0[+)V
public: NWt5)xl
int data_; Ou,Eu05jt'
}; & 8'QD~
y>iot e~
再进行编译,一切OK!。但是这样却失去了C++的构造初始化特性,这样做是没有任何意义的,我只是在说其在C++中的语义,并不是推荐大家使用(绝对不推荐)。但是我们可以在union中存储对象的指针,从而引用不同的对象类型。不用我再多说了吧,大家还是试试吧! ^,,lo<d_L
O od?ifA
二、类中union的初始化 l~j{i/>
GkYD:o=qx
由于union的共享内存特点,我们可以使我们的类存储不同的型别而不浪费内存空间,在类中我们可以声明一个union存储不同型别的指针,示例如下: `bMwt?[*
S/H!a:_5r
#pragma warning(disable : 4786) 3lo.YLP^
#include .p?kAf`
)uxXG`,h
using namespace std; 6Cvg-X@
>#8J@=iuqv
class TestUnion DfX}^'#m+
{ <rAWu\d;
enum StoreType{Long,Const_CharP}; 6"PwOEt
union n^:Wc[[m
{ ~h@<14c{X
const char* ch_; u8sK~1CPf
long l_; }\wTV*n`X
} data_; :j4i(qcF
StoreType stype_; q A?j-H
TestUnion(TestUnion&); 01AzM)U3"m
TestUnion& operator=(const TestUnion&); DY' 1#$;
public: ptvM>zw'~g
TestUnion(const char* ch); BzyzOtBp3L
TestUnion(long l); 0$e]?]X6
operator const char*() const {return data_.ch_;} y+K21(z.
operator long() const {return data_.l_;} EWn\]f|
}; ^ Z~'>J
& GM&,
TestUnion::TestUnion(const char* ch):data_.ch_(ch),stype_(Const_CharP) vddh 2G
{ BBUXoz
} i=DoK{`L
\[F4ooe
TestUnion::TestUnion(long l):data_.l_(l),stype_(Long) Ey* *j
{ L7 f'
} `z]MQdE_w
xulwn{R s
int main (void) xfqW~&
{ itmQH\9 8
TestUnion pszobj("yuankai"); +pMjm&CF
TestUnion lobj(1234); Fm,}sP"Qx
cout<(pszobj)< cout< Xh*p\ $
return 0; &