C++学习笔记(七)

时间:2022-04-16 21:37:16

1.共用体 union
其定义与结构体类似:
union 类型名{
  成员表列;
};
声明变量的方法也类似:
  a. union 类型名{            b. union { c.类型名 变量名;
    成员表列;                               成员表列;
  }a,b;                                }a,b;

长度计算:因为是从内存中同一起始地址开始的,所以占用内存长度最长的成员长度为共用体长度,而结构体不是,是将各个成员所占长度相加的。
引用:不能引用共用体变量,只能引用其成员,如定义了共用体变量a,引用其元素 a.xx; a.xxx;
注意:
  a.共用体是能在同一内存段中存放几种不同类型的数据,但在每一瞬时只能存放其中的一种,即每一瞬时只有一个成员在起作用;
  b.能够访问的共用体成员是最后一次赋值的成员,在对一个新的共用体成员赋值后,之前赋值的都已失去作用;
  c.共用体变量的起始地址就是每个成员变量的起始地址。
  d.不能对共用体变量名赋值,不能企图引用变量名来得到一个值,不能在定义共用体变量时对其初始化,不能用共用体变量名作函数参数。

举个共用体使用场合的例子:
  在学校录入学生教师信息时,教师的信息包括:name,num,sex,job,position
  学生的信心包括: name,num,sex,job,class
    job = s => class;
    job = t => position;
此时class和position就可以同占一个起始内存地址;定义结构体:

struct {
  int num;
  char name[20];
  char sex;
  char job;

  union P{
    int grade;
    char position[10];
  }category;
}person[2];

2.枚举类型
适用场景:一个变量的值只有几种可能。
enum 枚举类型名 {枚举常量列表}; //注意是枚举常量,是不能够赋值的
定义枚举类型变量:
enum week{sun,mon,tue,wen,thu,fri,sat};/*每个常量都是有值的,从左到右0-6,如果定义sun=7,即:
enum week{ sun=7,mon,tue,wen,thu,fri,sat };则第一个是7,其余的从7开始编号mon = 8*/


enum week day;//day就是枚举类型变量,在C++中不常使用 enum 即 week day;即可。

枚举类型可以比较,if( sun<mon );比较的是顺序号。未指定时,顺序号都是从0开始,自左向右递增。
所以可以这样赋值:
  day = (week)2;//c强制类型转换
  day = week(2);//c++强制类型转换
都表示:day = tue;
枚举类型常与switch语句合用

3.typedef 声明类型
这是用新的类型名代替已有的类型名
格式:
  typedef 类型名 新类型名;//注意分号,新类型名一般用大写表示,以便与系统的区分开
几种常见形式:
  a.结构体:
  typedef struct {
    int month;
    int day;
    int year;
  }DATE;//DATE并不是一个结构体变量,而是这个结构体类型的新名称

  b.typedef int NUM[10]; //声明NUM为整型数组类型,包含10个元素
    NUM n;//定义n为包含10个元素的整型数组,int n[10];
  c.typedef char *STRING; //声明STRING为字符指针类型
    STRING p,s[10]; //p为字符指针变量,s为指针数组(有10个元素)
  d.typedef int (*POINT)(); //声明POINT为指向函数的指针类型,函数返回整型值
    POINT p; //p为POINT类型的指针变量