位置:51电子网 » 技术资料 » 通信网络

Union的问题解答

发布时间:2008/9/12 0:00:00 访问次数:449

  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数据类型提供一组访问函数。

  欢迎转载,信息来自维库电子市场网(www.dzsc.com)



  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数据类型提供一组访问函数。

  欢迎转载,信息来自维库电子市场网(www.dzsc.com)



相关IC型号

热门点击

 

推荐技术资料

耳机的焊接
    整机电路简单,用洞洞板搭线比较方便。EM8621实际采... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!