@Moritz
2019-03-29T08:01:14.000000Z
字数 2454
阅读 487
课程学习
C++
谭浩强
所有文稿
在一个组合项中包含若干个类型不同的数据项,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)的优点
具体程序实例不再赘述
new
和delete
动态分配和撤销存储空间C中利用库函数malloc
和free
来分配和撤销存储空间,C++则提供运算符new
和delete
,可以用于动态链表的实现。
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;//指针变量前面加一对方括号,表示是对数组空间的操作
如果一个变量只能有几种可能的值,可以定义为枚举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; //以上三个语句等价
书本上给的例子里,其实枚举常量完全可以不用,并直接用数字代替,只不过更直观。
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