[关闭]
@Moritz 2019-03-29T08:01:14.000000Z 字数 2454 阅读 487

<谭浩强>第七章 用户自定义数据类型

课程学习 C++ 谭浩强 所有文稿


7.1 结构体类型

在一个组合项中包含若干个类型不同的数据项,C++允许用户自定义这样一种数据类型,称为结构体。结构体的声明中,大括号内是该结构体中的全部成员,每一个成员member也称结构体中的一个field,成员表又称域表。C++中的结构体成员接可以包括数据(包括结构体类型的数据),又可以包括函数

定义

(1)声明后,再定义

struct Student studen1,studen2;
Student studen1,studen2;//C++中可以省略关键字struct

(2)声明同时定义

struct Student{    //声明结构体类型Student
int num;
char name[20];
}student1,student2; //定义两个结构体类型Studen的变量studen1,studen2

定义时初始化

struct Student{    //声明结构体类型Student
int num;
char name[20];
}student1={1001,"Wang Li"};

Student student1=={1001,"Wang Li"};

引用

(1)赋值

student1=student2;

(2)引用其中一个成员的值,用到成员运算符.,在所有运算符中优先级最高

student.num=1001;

结构体数组

Student girl[10];    //定义Student类型的数组
girl[0].num=2001;
girl[0].name="Marry";

指向结构体变量的指针

1.引用成员

Student stu;
Student *p=&stu;
stu.num=3001;
(*p).name="Li Hua";  //括号不可以省略,"."优先级比"*"高
p->name="Li Hua";    //指向运算符"->",与上语句等价

指向运算符的几种运算分析

p->n;    //得到p指向的结构体变量中的成员n的值
p->n++;  //得到p指向的结构体变量中的成员n的值,用完该值后使它加1
++p->n;  //得到p指向的结构体变量中的成员n的值,并使之加1,然后再使用它

2.链表

链表有一个“头指针”变量,存放一个地址,指向一个元素。链表中的每一个元素称为结点,每个结点包括两部分:用户需要的实际数据和指向下一个结点的地址。最后一个元素不再指向其他元素,称为表尾,它的地址部分存放一个NULL表示空地址,链表到此结束。

链表分为静态链表动态链表。动态链表是指各结点是可以随时插入和删除的。

结构体作函数参数

(1)结构体变量名作参数,虚实结合时空间和时间开销较大
(2)指针,程序可读性不如(1)
(3)引用兼具(1)和(2)的优点

具体程序实例不再赘述

运算符newdelete动态分配和撤销存储空间

C中利用库函数mallocfree来分配和撤销存储空间,C++则提供运算符newdelete,可以用于动态链表的实现。

new int;//开辟一个存放整数的存储空间,返回一个指向改存储空间的地址(即指针)
new int(100);//开辟一个存放初值为100的整数的存储空间,返回一个指针
new char[10];//开辟一个存放包括10个元素的字符数组的空间,返回首元素地址

float *p=new float(3.14159);//开辟存放初值为3.14159单精度数的空间,地址赋给p

分配数组空间时不能指定初值。如果由于内存不足等原因无法正常分配空间,new会返回一个空指针NULL,用户可以根据指针的值判断分配空间是否成功。

delete p;//撤销上面开辟的存放单精度数的的空间

char *pt=new char[10];
delete []pt;//指针变量前面加一对方括号,表示是对数组空间的操作

7.2 枚举类型

如果一个变量只能有几种可能的值,可以定义为枚举enumeration类型。

声明

enum weekday{sum,mon,tue,wed,thu,fri,sat};

花括号内为枚举元素枚举常量,不是变量,不可以对他们赋值,其值是一个整数,编译系统按定义时顺序对他们赋值为0,1,2,3...。这个值是可以输出的。

(enum) weekday workday;
workday=mon;//把枚举常量mon的值赋给枚举变量workday,workday值为1
cout<<workday;//输出1

也可以在声明该类型时指定枚举元素的值

enum weekday{sun=7,mon(....)};//mon=1,以后按顺序加1,sat为6

不可以直接把一个整型赋给枚举变量,应先进行强制类型转换

workday=(weekday)2;    //C格式
workday=weekday(2);    //C++风格
workday=tue;           //以上三个语句等价

书本上给的例子里,其实枚举常量完全可以不用,并直接用数字代替,只不过更直观。

7.3 用typedef声明新的类型名

typedef声明新的类型名来代替已有的类型名

typedef int INTEGER;
INTEGER i,j;

typedef struct{
int month;
int day;
int year;}DATE;       //DATE是新类型名,不是结构体变量名

typedef int NUM[100]; //NUM为整型数组类型,包含100个元素
NUM a;                //a为包含100个整型元素的数组

typedef char *  STRING;//字符指针类型
typedef int(* POINTER)();//声明POINTER为指向(返回整型)函数的指针类型

便于程序通用和移植。例如,把一个程序从一个以4个字节存放整数的C++系统移植到以两个字节存放整数的系统,需要把定义变量中每个int改成long。利用`typedef可以简化该过程。

typedef int INTEGER;

在程序中所有的整数都用INTEGER定义,移植时,直接改变typedef定义语句

typedef long INTEGER;

完成施工 -2019.1.18


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注