分类:
2007-11-25 10:22:29
本文中写的都是它们在C++中的异同,而非C中的,因为在C中无论是union还是stuct都没有操作,也没有访问控制的概念。
这几天工作不是很忙,就顺手把Bruce Eckel的Thinking in C++ Volume 1 翻着浏览一下。
看到Chapter 7中关于union这一节,竟然发现union也有类似于class的用法,咦,以前看的时候怎么就没有发现呢,是不是以前仅仅是走马观花?也或许这本书的确不错,它的精华我不可能第一次阅读的时候就能够全部体会到,因而每读一次就有新的体会。
Union、struct 和 class 的确是有很多类似的用法。这儿权当是读书笔记,记下来吧。
这里,还是举例说明吧。
先定义如下三个抽象类型。
union unionA { int m_iInt; char m_cChar; int getInt(){ initializePara(); }; public: unionA(){ initializePara(); }; ~unionA(){ cout<<"unionA::~unionA()"< }; public: char getChar(){ return m_cChar; }; private: void initializePara(){ m_iInt = 0; m_cChar = 'A'; }; }; |
struct structB { int m_iInt; char m_cChar; int getInt(){ initializePara(); }; public: structB (){ initializePara(); }; ~ structB (){ cout<<" structB::~ structB()"< }; public: char getChar(){ return m_cChar; }; private: void initializePara(){ m_iInt = 0; m_cChar = 'A'; }; }; |
class classC { int m_iInt; char m_cChar; int getInt(){ initializePara(); }; public: classC (){ initializePara(); }; ~ classC (){ cout<<"classC::~ classC ()"< }; public: char getChar(){ return m_cChar; }; private: void initializePara(){ m_iInt = 0; m_cChar = 'A'; }; }; |
1.Union、struct 和 class 都可以像对象一样,定义成员数据和成员函数。
2.Union 和 struct 默认的成员是public的,而class 默认的是 private。
3.Union 既不能够继承,也不能被继承,而struct 和 class 都可以用来继承和被继承。
如下例:
/* // error
class classSubA: public unionA
{
};
*/
/* // error
union unionSubA: public unionA{
};
*/
struct structSubB:public structB{
};
class classSubC: public classC{
};
struct structSubC:public classC{
};
class classSubB:public structB{
};
4.空间不同,如上例,int m_iInt; 和 char m_cChar;共用相同的空间,其空间大小为他们中较大的一个(在32位机中,int 为 4个字节,char 为一个字节)。而class 和 struct 则不是的。
我在VC6.0下试过了,确实是这样,
因为如果支持多态,不支持多继承,
那不是和没有一样吗。
而,struct 支持继承,它也支持多态,
有虚函数列表,和 class 一样
typedef unsigned short VARTYPE;
struct _tagMyVariant
...{
VARTYPE vt;
union
...{
LONG lVal;
BYTE bVal;
...
};
};