主要内容
C++允许用户声明自定义类型(Undefined Type,UDT),包括结构体(structure)类型、共用体(union)类型、枚举(enumeration)类型、类(class)类型。
C++的类(class)类型就是在结构体类型基础上扩充发展起来的。
结构体
sturct是声明结构体类型的关键字。大括号内是结构体中全部的成员,由它们组成一个特定结构体。每一个成员也称为结构体中的一个域,所以成员表又称域表。
结构体相当于一个模型,不占用存储空间。
本文件需要用到某个结构体类型时,可以用#include指令将包含结构体声明的文件包含到本文件中。如: #include <file1.cpp>
1)结构体变量初始化
2)引用结构体变量
1. 赋值
2. 引用变量的成员
“.”为成员运算符,在所有运算符中优先级最高。
变量的成员只能单独输入或者输出,但可以同时赋值。
3)结构体数组
4)指向结构体变量的指针
5)链表
链表是一种常见的数据结构。在结构体中,将下一个结点的地址放到前一个结点的成员next(命名习惯)中,这样可以方便产生一系列的变量(对象)。
例如:
#include <iostream>
using namespace std;
struct Student
{
int num;
Student * next; /*next符合命名习惯*/
};
int main()
{
Student a,b,c,* head,* p; /*head符合命名习惯*/
a.num = 1001;b.num = 1002;c.num = 1003;
head =&a;
a.next = &b;b.next = &c;c.next = NULL;
p = head;
do
{
cout<<p->num<<endl;
p = p->next;
} while(p != NULL);
return 0;
}
6)用结构体变量的引用作函数参数(效率最高的传递方式)
#include <iostream>
using namespace std;
struct Student
{
int num;
};
void print(Student &);
int main()
{
Student a = {1001};
print(a);
return 0;
}
void print(Student & stu)
{
cout<<stu.num<<endl;
}
7)动态分配和撤销存储空间
C++提供了new和delete运算符来动态分配和撤销空间,使用方式如下:
//开辟一个存放整数的存储空间,返回一个指向该空间的地址(指针)
new int;
//开辟一个存放整数的空间,并赋初值为100,之后将该空间的地址赋给指针变量
int *p = new int(100);
//开辟一个存放长度为10的字符数组的空间,并将数组首元素的地址赋给指针变量
char *p = new char[10];
//撤销变量的空间
delete p;
//撤销数组的空间
delete [ ] p;
例子:
int main()
{
Student * p;
p = new Student;
p->num = 1001;
cout<<p->num<<endl;
delete p;
return 0;
}
枚举类型
所谓“枚举”是指将变量的值一一列举出来,变量的值只能在列举的值域里面取。
声明枚举类型用enum开头。例如:
enum weekday {sun,mon,tue,wed,thu,fri,sat};
花括号中的元素称为枚举元素或枚举常量。
声明了枚举类型后就可以用它来定义变量。
weekday workday,weekend;
当然,我们也可以在声明枚举类型的同时定义变量,也可以在定义变量的同时赋初值。
需要注意的是,枚举元素作为常量是有值的。编译系统默认将枚举元素按顺序从0开始往后赋值。如执行语句
workday = mon;cout<<workday;
输出的结果将会是1,而不是字符串mon。
除此之外,我们还可以把枚举元素赋给整型变量。
先对整型变量(顺序号)进行处理,再利用强制类型转换处理枚举类型变量。
虽然可以在声明枚举类型时指定枚举元素的值,但是这样书写会比较混乱,不建议。
枚举值可以按整数比较规则比较大小,且排列在前的枚举元素大于后面的枚举元素。如:
if(workday == mon) { }
在上例中,虽然workday的值是一个整数,但我们并不能将一个整数直接赋给workday,需要用到强制类型转换:
workday = weekday(1);
作用是将weekday中顺序号为1的枚举元素赋给workday,相当于
workday = mon;
用typedef声明新的类型名
1)用typedef声明一个新的类型名来代替已有的类型名
如:
typedef int INTEGER;
typedef float REAL;
2)用typedef对一个结构体类型声明新名字
如:
typedef struct
{
int num;
} NUMBER;
1. 声明ARR为一个包含100个元素的整型数组,并用ARR定义数组
typedef int ARR[100];
ARR a,b,c; //这样定义会更加方便
2. 声明STRING为字符指针,并用STRING定义指针和指针数组
typedef char * STRING;
STRING c,s[10];
3. 声明FUCP是函数指针,函数返回值为整型。
typedef (* FUCP)();
FUCP p;