我的C++学习笔记 结构与共同体

在此前我们我们介绍了string类的使用方法,今天我们继续介绍其他数据类型,结构和共同体。


1.定义

结构关键字为struct,主要用于存储多个不同类型变量的不同信息,注意这里的多个,这个是跟共同体的主要区别。举例说明,假如我们居委会要做一个附近人口信息表,表内包括姓名,年龄和身份证后四位,如果按照一般的方法我们要准备一个二维数组或者字符串数组和两个int数组,然而三个数组背后意味着修改查询信息的不方便,我们希望所有的信息能够存储到一起,那么struct可以做到这一切,同时struct也为之后的类打下了基础。

结构的定义方法如下

1
2
3
4
struct 结构名
{
 //成员列表
};

以上面那个人口信息为例如下

1
2
3
4
5
6
struct peopleInfor
{
char name[20];
int age;
int id;
};

但是需要注意一点,这里只是对peopleInfor这个结构类型进行定义,而不是声明了某个变量1。那么我们还要声明变量才能够使用,值得一提的是,在C++中结构变量声明时可以省略struct关键字并且可以声明结构数组,即以下两种声明方法都没有问题。

1
2
struct peopleInfor infoData[20];
peopleInfor inforData[20]

共用体是一种数据格式,关键字为union,它能够储存不同变量类型的一个信息,即不同于一个结构中可以包含多个信息,一个共用体中只能包含一个信息,只不过这个信息可以以不同的数据类型来储存。举例来说当我们用共用体来存储身份证后四位时,我们可以选择是以字符串类型存储还是以整型类型存储,这样能极大的节省内存。

其定义方式如下

1
2
3
4
5
union idInfor
{
 int intId;
 char charID[20]
};

当然,这个只是定义数据类型,我们还是要声明变量的,但是如下的声明方法在C++中同样适用,这表明我们在定义的同时声明了一个名为id的变量。值得一提的是,重复给共同体中两个类型赋值,只会保留最后输入的值和类型。

1
2
3
4
5
union idInfor
{
 int intId;
 char charID[20];
}id;

2.程序及解析

列出一个附近居民的信息表,包括姓名,年龄和身份证后四位,要求初始化两组,输入第三组,并且输出第一个人的姓名,第二人年龄和第三人的后四位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//04.cpp struct and union
#include <iostream>
#include <string>

struct familyMember
{
  std::string name;
  int age;
   union idInfor
     {
      int intId;
      char charID[20];
     }id;
  };
  
int main()
{
  using namespace std;
  
  familyMember fB[3] = 
  {
      {"Mr.Q",
          24,
          1314},
          
      {"Miss.Y",
          22,
          9716}
      };
      
      cout<<"Please input the third member's name"<<endl;
      cin>> fB[2].name;
      
      cout<<"Please input the third member's age"<<endl;
      cin>> fB[2].age;
      
      cout<<"Please input the third member's id"<<endl;
      cin>> fB[2].id.charID;
      
      cout<<"the first person is "<<fB[0].name
          <<" and the second's age is "<<fB[1].age
          <<" ,the the third's id is "<<fB[2].id.charID<<endl;
      
  
  return 0;
  }

程序运行结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
Please input the third member's name
Baby.Q
Please input the third member's age
2
Please input the third member's id
12XX
the first person is Mr.Q and the second's age is 22 ,the the third's id is 12XX


------------------
(program exited with code: 0)
Press return to continue

这里注意几个问题,首先,我们可以像初始化数组一样初始化结构。其次,我们可以用成员运算符.来访问结构中的各个成员,这种方法在日后的类中会经常使用的。 最后,我们要讨论一下共用体初始化的规则,先上程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//04.cpp struct and union
#include <iostream>
#include <string>

union idInfor
   {
     int intId;
     char charID;
   };

  
int main()
{
  using namespace std;
  
   idInfor id={123};
   
   cout<<id.intId<<endl;
   cout<<id.charID<<endl;
   
   idInfor id2={.charID='0'};
    
   cout<<id2.charID<<endl;
   
   id2=id;
   
   cout<<id2.intId<<endl;
  
  return 0;
  }

运行结果如下

1
2
3
4
5
6
7
8
9
123
{
0
123


------------------
(program exited with code: 0)
Press return to continue

由此可得出共用体的几个规则 (1)同一个内存段可以用来存放几种不同类型的成员,但是在每一瞬间只能存放其中的一种,而不是同时存放几种。换句话说,每一瞬间只有一个成员起作用,其他的成员不起作用,即不是同时都在存在和起作用。共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后,原有成员就失去作用。 (2)共用体可以以类似idInfor id={123};或类似idInfor id2={.charID='0'};的方法初始化,只不过第一个方法是初始化默认类型,即第一个类型,而第二种方法可以初始化指定类型。


以上纯属个人观点,欢迎大家指正,如果有什么地方令您不满,请尽快告知,鄙人会酌情判断进行修改。若修改后鄙人观点还是令您不悦——你咬我啊。(╯°Д°)╯︵ ┻━┻


  1. peopleInfor本身是像int这样的数据类型,而不是我们声明的变量。

Comments