(2020.11.28 Sat)
构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的,即,一个构造类型的值可以分解为若干个成员或元素。每个成员或元素都是一个基本数据类型或构造类型。有以下几种
- 数组类型
- 结构体类型
- 共用体类型
- 枚举类型
- 用户自定义类型数据
结构体structure
结构体类型的数据由若干称为成员的数据组成,每一个成员可以是基本数据类型的数据,也可以是构造类型的数据。
结构体是一个可以包含不同数据类型额结构,是一种可以自己定义的数据类型,和数组的差距在于
- 结构体可以在一个结构中声明不同的数据类型
- 相同结构的结构体变量可以互相赋值,而数据做不到
结构体语法格式如下
struct 结构体标识符
{
成员变量列表
}; //注意结尾有分号;
结构体的struct+标识符结构可以作为数据类型名用,比如
struct point
{
double x;
double y;
double z;
};
struct line
{
struct point StartPoint; //前一个结构体用来定义了一个数据
struct point EndPoint;
};
定义结构体类型变量
- 先定义结构体类型再单独进行变量定义
struct student
{
int code;
char name[20];
char sex;
int age;
};
struct student stu; //定义struct student类型变量
struct student stu[20]; //定义类型数组
struct student *pstu; //定义类型指针
- 紧跟在结构体类型说明之后进行定义
struct student
{
int code;
char name[20];
char sex;
int age;
}stu, stu[20], * pstu;
- 在说明一个无名结构体类型的同时直接进行定义
struct
{
int code;
char name[20];
char sex;
int age;
}stu, stu[20], *pstu;
- 使用typedef说明一个结构体类型名后再用新类型名定义变量
typedef struct
{
int code;
char name[20];
char sex;
int age;
}student;
student stu, stu[20], *pstu;
初始化结构体变量
struct student
{
int code;
char name[20];
char sex;
int age;
};
struct student stu={0917880,'Jeff Z', 'M', 26};
//另一种
struct student
{
int code;
char name[20];
char sex;
int age;
}stu={0917880,'Jeff Z', 'M', 26};
//另一种
struct
{
int code;
char name[20];
char sex;
int age;
}stu={0917880,'Jeff Z', 'M', 26};
//
struct
{
int code;
char name[20];
char sex;
int age;
}stu={0917880}; //只给第一个变量赋值,后面的变量由系统自动赋默认的初值
对于最后一种情况,四个变量只有第一个赋值,后面的其他元素由系统自动赋值,char数组类型的初值为空,char类型的初值为'\0x0',int的初值为0。
引用结构体成员变量
用三种方式引用结构体变量
1. 结构体变量名.成员名 //.为成员运算符
2. 指针变量名->成员名 //->为结构指向运算符
3. (*指针变量名).成员名
一个栗子
#include
struct student
{
int code;
char name[20];
char sex;
int age;
};
struct student stu={0917880,'Jeff Z', 'M', 26};
void main()
{
struct student *pstu = &stu;
cout<code<
//结构体student部分同上
void main()
{
struct student *pstu;
for (pstu=stu; pstucode<name<sex<age<
结构体作为函数参数
一般来说,结构体作为函数参数使用的是引用传递。利用引用传递的好处很多,效率和指针相差无几,但引用的操作方式和值传递几乎一样。当结构体很大时,避免传递结构体变量很大的值,节省内存。
#include
#include
struct test
{
char name[10];
float score;
};
void print_score(test &p) //&符号表示引用
{
cout<
共用体union
共用体类型的说明、引用方式和结构体完全相同 ,但是结构体变量中的成员各自占有自己的存储空间,而共用体变量中的所有成员占有同一个存储空间。
枚举enumerate
针对集合类问题,比如比赛有输赢两个状态,一周有7天。在计算机中表述这些信息,需要定义一组整型常量,这些常量虽然表达了同一类型的信息,但是在语法上是彼此孤立的个体,不是一个完整的逻辑整体。引入枚举来表述。语法如下
enum 枚举标识符 {常量列表} //常量列表中元素之间用逗号分隔
比如
enum direction {up, down, before, back, left, right}; //列表中的元素可直接饮用
enum direction {up=1,down=2,before=3,back=4,left=5,right=6}; //赋初值
常量列表中的元素如果不赋值,则系统自动赋初值,第一个元素是0,第二个是1,以此类推。出现下面的情况
enum direction {up = 7,down=1,before,back,left,right};
系统从第一个没有设定值的常量开始,其整数常量值为前一枚举常量对应的整数常量的值+1。
#include
enum direction1 {up1, down1, before1, back1, left1, right1};
enum direction2 {up2=7, down2=2, before2, back2, left2, right2};
void main()
{
cout<<'direction1.up1='<
定义枚举类型变量
enum direction {up, down, before, back, left, right};
enum direction first direction, second direction;
//或
enum direction {up, down, before, back, left, right} first direction, second direction;
引用枚举类型变量
#include
enum COLORS {BLACK, BLUE, GREEN, RED};
void main()
{
enum COLORS a,b,c;
enum COLORS *pa;
int d =-2;
a= RED;
b = BLUE;
c = GREEN;
cout<<'a='<b)
pa = &a;
else
pa = &b;
cout<<'*pa='<<*pa<
代码的返回,a返回RED对应的默认值3,*pa返回1,e返回4。
类型重定义typedef
typedef为数据类型定义新的类型名称,从而丰富数据类型所包含的属性信息语法格式如下
typedef 类型名称 类型标识符;
其中的类型名称,为已知数据类型名称,包括基本数据类型和用户自定义数据类型。类型标识符为新的类型名称。比如
typedef double LENGTH;
typedef unsigned int COUNT;
定义之后,可以像用基本数据类型那样定义变量
LENGTH a;
COUNT b;
主要应用有如下几种形式
- 为基本数据类型定义新的类型名
如前面所示 - 为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称
比如由结构体定义
typedef struct
{
double x;
int y;
char z;
}Point; //该结构体定义为Point数据类型
Point kkk; //定义一个叫kkk的Point数据类型
- 为数组定义简洁的类型名称
用typedef为长度为10的整数数组定义新的名称
typedef int INT_ARRAY_10[10];
INT_ARRAY_10 a,b,c,d; //定义了四个长度为10的整数数组
- 为指针定义简洁的名称
可以为数据指针定义新的名称
tyepdef char * STRING;
STRING csname={" John'}; < code>
也可以为函数指针定义新的名称
typedef int (*myfun) (int a,int b);
int max(int a, int b);
myfun *pmyfun;
pmyfun = max;
使用typedef时,应注意以下事项
- typedef的目的是为已知数据类型增加一个新的名称,并没有引入新的数据类型
- typedef只适用于类型名称定义,不适合变量的定义
- typedef和#define有相似之处但实质不同,#define是预编译处理命令,主要定义常量,此常量可以为任何的字符及其组合,在编译之前,将此常量出现的所有位置,用其代表的字符或字符组合无条件的替换,然后进行编译。
Reference
1 刘蕾编著,21天学通C++(第五版),电子工业出版社
2 聚慕课教育研发中心 编著,C++从入门到项目实践(超值版),清华大学出版社