自定义数据类型(C++谭浩强第三版笔记)

用户自定义类型(user-defined type ,UDT):

结构体(structure)、共用体(union)类型、枚举(enumeration)类型、类(class)类型等。

一、结构体(structure)

  结构体:在一个组合项中包含若干个类型不同(也可相同)的数据项。

1.1 一般形式:

        struct 结构体类型名
          { 成员表(域表)};

1.2 定义结构体类型变量的方法

方法一:先声明结构体类型再定义变量;
方法二:声明类型同时定义变量;

如:

struct Student      //声明一个结构体类型 Studentint 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++保留):利用库函数 mallocfree来分配和撤销内存空间。
C++:用newdelete运算符来取代。

注:
  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.用于不同系统之间移植更改效率高,正常将定义类型单独放在一个头文件,使用方便。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值