C++ Union

Union

  1. 共享存储空间(三选一!)
union user{
  //从以下三个情况选择一种
    int ival;
    double dval;
    char cval;
}

1. 统一数据空间用两种操作方式进行操作

  1. 常用于系统软件和嵌入式系统
  2. 例子(将数组组合成矩阵)
double  _element[3][3];
int  i, j;
for (i=0;i<3;i++)
    for (j=0;j<3;j++)
         _element [i][j] = (i+1)*(j+1);

for ( i=0;i<3;i++){
  for ( j=0;j<3;j++)
    cout << _element [i][j] << "  ";
  cout << endl;
}
union  Matrix{
    struct
    {   double  _a11, _a12, _a13;
        double  _a21, _a22, _a23;
        double  _a31, _a32, _a33;
    };
    double _element[3][3];
};
//如果没有struct,那么布局会出现问题
Matrix m;
int  i, j;
for (i=0;i<3;i++)
    for (j=0;j<3;j++)
         m._element[i][j] = (i+1)*(j+1);
         //每个单元都有两个名称

for ( i=0;i<3;i++){
  for ( j=0;j<3;j++)
    cout << m._element[i][j] << "  ";
  cout << endl;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f4XbjJTb-1645665240350)(https://spricoder.oss-cn-shanghai.aliyuncs.com/2020-C-plus-plus-advanced-programming/C+±数据结构/img/union/1.png)]

2. Union的另一种用法

  1. 例:定义数组, 存储100个图形(直线、矩形、圆)
struct Line{
  int x1, y1, x2, y2
};
struct Ellipse{
  int x, y, r; 
};
struct Rectangle{
  int lef, top, rig, bot;
}
//第一种实现
Line figures_L[100];
Rectangle figures_R[100];
Ellipse firgures_E[100];
//过于浪费空间
//第二种实现
enum FIGURE_TYPE  {LINE, RECTANGLE, ELLIPSE};//使用标签来确认其类别
struct Line{
  FIGURE_TYPE t ;
  int x1, y1, x2, y2;
};
struct Ellipse{
  FIGURE_TYPE t; 
  int x, y, r; 
};
struct Rectangle{
  FIGURE_TYPE t;
  int left, top, rig, bot;
}
union FIGURE{
  FIGURE_TYPE t;//共享了第一块空间
	Line line;	
	Rectangle rect; 
	Ellipse ellipse;
};

FIGURE  figures[100];
void main()
{   input( figures, 100 );
    for (int i=0;i<100;i++)
         draw(figures[i]);
} 

//API:
void draw_line(int,int,int,int);
void draw_rect(int,int,int,int);
void draw_ellipse(int,int,int);
  1. Union占据的空间:
  • 选中最大的空间进行共享
  • 注意最右边的t,这方便了我们的访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iIS6EYTJ-1645665240351)(https://spricoder.oss-cn-shanghai.aliyuncs.com/2020-C-plus-plus-advanced-programming/C+±数据结构/img/union/2.png)]

//多态性
void draw(FIGURE  figure){
  switch ( figure.t ){
    case LINE:
      draw_line(figure.line.x1, ……);
      break;
		case RECTANGLE:
      draw_rect(figure.rect.lef, ……);
      break;
		case ELLIPSE:
      draw_ellipse(figure.ellipse.x, ……);
      break;
	}
}
void input (Figure fig[],  int size){    
  int t;
  for (int k=0; k<size; k++){
    cin >> t;
    switch (t){
      case LINE:
        fig[k].type = LINE;
        cin >> fig[k].line.x1 >> fig[i].line.y1 >> fig[k].line.x2  >>  fig[i].line.y2;
        break;
      case RECTANGLE:   ……	
      case ELLIPSE:   …….
    }
  }
}
  1. 如果要增加color和width
enum FIGURE_TYPE  {LINE, RECTANGLE, ELLIPSE};//使用标签来确认其类别
struct Line{
  FIGURE_TYPE t ;
  int color, int width;
  int x1, y1, x2, y2;
};
struct Ellipse{
  FIGURE_TYPE t;
  int color, int width; 
  int x, y, r; 
};
struct Rectangle{
  FIGURE_TYPE t;
  int color, int width;
  int left, top, rig, bot;
}
union FIGURE{
  FIGURE_TYPE t;//共享了第一块空间
  int color, int width;
	Line line;	
	Rectangle rect; 
	Ellipse ellipse;
};

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-biLQYTkU-1645665240351)(https://spricoder.oss-cn-shanghai.aliyuncs.com/2020-C-plus-plus-advanced-programming/C+±数据结构/img/union/3.png)]

  1. C++不希望在运行时进行类型检查
  • 所有C++利用virtual func来进行实现

3. 互斥赋值

  1. 在任何时刻,联合中只能有一个数据成员可以有值。当给联合中某个成员赋值之后,该联合中的其他成员就会变成为赋值状态

4. 结构和联合

  1. 通过使用union完成和保证c++运行时的多态性

5. 参考

C++ 关于union的理解

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值