| Union的问题解答 |
| 类别:通信网络 |
| 1、联合里面那些东西不能存放? 我们知道,联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。 2、类可以放入联合吗? 我们先看一个例子: class TEST { public: TEST():data(0) { } private: int data; }; TYPEdef union _TEST { TEST TEST; }UI; 编译通不过,为什么呢? 因为联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。 3、又是匿名惹的祸?? 我们先看下一段代码: class TEST { public: TEST(const CHAR* p); TEST(int in); const operator CHAR*() const {return data.ch;} operator long() const {return data.l;} private: enum TYPE {Int, String }; union { const CHAR* ch; int i; }dataTYPE; TYPE sTYPE; TEST(TEST&); TEST& operator=(const TEST&); }; TEST::TEST(const CHAR *p):sTYPE(String),dataTYPE.ch(p) { } TEST::TEST(int in):sTYPE(Int),dataTYPE.l(i) { } 看出什么问题了吗?呵呵,编译通不过。为什么呢?难道dataTYPE.ch(p)和dataTYPE.l(i)有问题吗? 在构造函数中当然要调用其成员的构造函数,所以其要去调用dataTYPE成员的构造函数,但是他没有构造函数可调用,所以出错。 注意了,这里可并不是匿名联合!因为它后面紧跟了个data! 4、如何有效的防止访问出错? 使用联合可以节省内存空间,但是也有一定的风险:通过一个不适当的数据成员获取当前对象的值!例如上面的ch、i交错访问。 为了防止这样的错误,我们必须定义一个额外的对象,来跟踪当前被存储在联合中的值得类型,我们称这个额外的对象为:union的判别式。 一个比较好的经验是,在处理作为类成员的union对象时,为所有union数据类型提供一组访问函数。 |
- 城市交通COOT和..
- 2007-10-27
- ADSL CO局端..
- 2007-8-9
- DSP在移动通信中..
- 2007-8-7
- 高性能RF收发器C..
- 2007-8-9
- HPC相关新技术的..
- 2007-8-9
- 微格教学及远程管理..
- 2007-7-29
- 宽动态范围的VGA..
- 2007-8-9
- CDMA/FM接收..
- 2007-8-9
- 单线CAN总线收发..
- 2007-8-9
- 多点共线无中心载波..
- 2007-8-9
- 基于80C196K..
- 2007-8-9
- IRIG-E标准F..
- 2007-8-9
- 三一重工CIMS网..
- 2007-8-7
- 中国民航AFTN电..
- 2007-8-7
- 数字语音混沌保密通..
- 2007-7-29
- 网络通信中的基本安..
- 2007-7-29
- 一种高码速率的微波..
- 2007-8-9
- WIN95下虚拟设..
- 2007-8-9
- Java的线程机制
- 2007-7-29
- 北京公交GPS车辆..
- 2007-8-9



