用户自定义类型(user-defined type ,UDT):
结构体(structure)、共用体(union)类型、枚举(enumeration)类型、类(class)类型等。
一、结构体(structure)
结构体:在一个组合项中包含若干个类型不同(也可相同)的数据项。
1.1 一般形式:
struct 结构体类型名
{ 成员表(域表)};
1.2 定义结构体类型变量的方法
方法一:先声明结构体类型再定义变量;
方法二:声明类型同时定义变量;
如:
struct Student //声明一个结构体类型 Student
{
int num; //每个成员(或称一个域)
char name[20]; //类型名 成员名
char sex;
int age;
float score;
char addr[30];
}; //定义变量,方法二:将 【;】改为 【student 1,student2;】
Student student1 ,student2; //定义变量,方法一
1.3 引用结构体变量:
方法一:可将结构体变量赋值给另一相同结构体变量。如:student1=student2;
方法二:可引用结构体变量中一个成员的值。如:student1.num =10010;
可得一般形式为:结构体变量名.成员名
1.4 结构体数组
结构体数组:每个数组元素都是一个结构体类型的数据,都分别包括各个成员项目。
如: Person leader[3]={"LI",0,"Zhang",0; //定义Person类型的数组。内容为名字和得票数。
1.5 指向结构体变量的指针:
一个结构体变量的指针:该变量所占据的内存段的起始地址。
设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。
指向结构体变量的运算符:“—>”称为指向运算符。
三种等价形式:
1.结构体变量.成员名。 如:stu.num。
2.(*p).成员名。 如:(*p).num。
3. p—>成员名。 如:p—>num。
1.6 用 结构体变量 和 指向结构体变量的指针 构成链表
#include<iostream>
struct student
{ int num;
float score;
struct student *next;
};
int main()
{ student a,b,c,*head,*p;
a.num = 31001;a.score =89.5;
b.num = 31003;b.score =90;
c.num = 31007;c.score =85;
head =&a; /将结点a的起始地址赋予头指针head
a.next =&b; /将结点b的起始地址赋予a结点的next成员
b.next =&c; /将结点c的起始地址赋予b结点的next成员
c.next =NULL; /结点的next成员不存放其他结点地址
p =head; /使p指针指向a结点
do
{ cout<<p->num<<" "<<p->score<<endl; /输出p指向的结点的数据
p=p->next; /使p指向下一个结点
}while(p!=NULL); /输出完c结点后p的值为NULL
return 0;
}
以上这种链表称为:静态链表,即:所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完后释放。
动态链表:各结点是可以随时插入和删除的,这些结点并没有变量名,只能先找上一个结点,才能根据它提供的下一个结点的地址找到下一个结点。只有提供第一个结点的地址,即头指针head,才能访问整个链表。
1.7 一个结构体变量中的数据传递给另一个函数,方法有三:
方法一:用结构体变量名作参数。(一般很少用这种方法)
方法二:用指向结构体变量的指针作实参,将结构体变量的地址传给形参。
方法三:用结构体变量的引用作函数形参,它就成为实参(是结构变量)的别名。
课本P200有三个实例。
1.8 用new和delete运算符进行动态分配和撤销存储空间
C语言(C++保留):利用库函数 malloc和free来分配和撤销内存空间。
C++:用new和delete运算符来取代。
注:
1.new运算符:动态分配内存。 delete运算符:释放已经分配的内存空间。
2.new与delete可适用于任何情况,但malloc与free却很多时候不适用。
原因:在类当中,malloc不会调用类的构造函数,而new会调用类的构造函数,同样道理,free不会调用类的析构函数,而delete会调用类的析构函数。
new运算符的一般格式:
指针变量 = new 类型 (常量)
指针变量 = new 类型 [表达式]
注:
1.常量是初始值可以缺省。
2.用new分配数组空间时不能指定初值。
3.作用:从堆分配一块类型大小的存储空间,并返回初始值。
delete运算符的一般格式:
delete 指针变量(对变量)
delete[ ] 指针变量(对数组)
注:
指针变量必须是一个new返回的指针,其实malloc返回的指针也是可以的。
关于new和delete的用法:
new int ; /开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)
new int(100); /开辟存放一个整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址
new char[10] ; /开辟一个存放字符数组(包含10个元素)的空间,返回字符数组首元素的地址
new int[5][4]; /开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址
float *p = new float(3.14159)
/开辟一个存放单精度数的空间,并指定该数的初值为3.14159,将返回的该空间的地址赋给指针变量P
二、枚举(enumeration)类型:
枚举(enumeration)类型:若一个变量只能有几种可能的值,则可定义枚举类型。
所谓“枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。
声明枚举类型的一般形式:
enum 枚举类型名 [枚举常量表];
说明:
1.枚举元素按常量处理,故称枚举常量。(不能赋值,值是固定的)
2.枚举元素作为常量是有值的,其值为整数,按定义时的顺序赋值0,1,2,3,…(也可以申明时指定元素的值)。
3.枚举值可做判断比较,按整数比较规则。
4.不可对枚举变量直接赋整数,只接受枚举类型数据。
三、类(class)和对象
四、用typedef声明新的类型名
用typedef声明一个新的类型名来代替已有的类型名:
typedef int INTEGER; //指定用标识符INTEGER代表int
//故而以下两行等价
int i,j;
INTEGER i,j;
归纳:
声明一个新类型名的方法【数组】:
1.先按定义变量的方法写出定义语句(如 int i;)【int n[100];】。
2.将变量名换成新类型名(如 将i换COUNT,即 int COUNT)【int NUM[100];】。
3.在最前面加typedef(如 typedef int COUNT)【typedef int NUM[100];】。
4.然后可用新类型名(如 COUNT)去定义变量【NUM n;(n是包含100个整型元素的数组)】。
注:
1.typedef只对已存在的类型增加一个类型名,没有创造新的类型。
2.可用typedef声明新类型名,但不能用来定义变量。
3.用typedef声明数组类型、字符串类型,比较方便。
4.用于不同系统之间移植更改效率高,正常将定义类型单独放在一个头文件,使用方便。