自定义类型
除了之前提到的整数、浮点数、数组等内置数据类型,C/C++还提供了一些自定义类型。所谓自定义类型就是允许在编程时定义新的数据类型,内置类型可以直接使用,比如可以直接定义int类型的变量,但自定义类型需要先定义类型再使用该类型。所以,自定义类型的使用分为两步:
1.定义该类型
2.使用该类型定义变量
内置类型最重要的就是数据宽度,而自定义类型更侧重于逻辑上的定义,类型本身反映了数据的逻辑特征而不是存储特征。C/C++允许的自定义类型有多种。
一、枚举类型
枚举类型只能定义枚举变量,枚举变量希望定义一种赋值被限制为有限个确定整数的变量。例如,想要定义一个变量来存储周一到周天的某一天,一种方法是定义一个普通的整数型变量,给变量赋值0-6。但这种方法可能被赋值其他类型的数值如浮点数,而且0-6这六个整数代表的意义并不那么明显。
枚举变量则可以解决这个问题,例如:
enum DAY{
SUN=0, MON=1, TUE=2, WED=3, THU=4, FRI=5, SAT=6};
enum Day day = MON; // day == 1
day = SAT; // day == 6
此时枚举变量相比于普通的整数型变量有两个优点:
1.希望将变量可赋值的范围限制在给定的有限个整数中(通常称这些整数为枚举数)
2.用有意义的标志代表这些用于赋值的整数
首先定义枚举类型,再使用这种自定义类型定义枚举变量。这里提到,只是“希望”将可赋值的范围限制到给出的有限个整数中,但是实际上完全可以为一个枚举变量赋此范围之外的其他值,例如:
enum DAY {
a = 10,b = 20}; // 1.定义枚举类型
enum DAY day = a; // 2.定义枚举变量
day = b;
day = 30; // 可以赋值枚举数之外的整数
day = 'a'; // ,day == 97,可以赋值枚举数之外的其他被识别为整数的字面量
day = 123.45; // day == 123,可以赋值非整数类型进行隐式类型转换
在定义枚举类型时,各个枚举数可以不赋值,例如:
enum DAY {
a = 10,b = 20,c = 30,d = 40};
enum DAY {
a = 10,b,c,d}; // 10,11,12,13
enum DAY {
a,b = 20,c = 5,d}; // 0,20,5,6
enum DAY {
a,b,c,d}; // 0,1,2,3
如果第一个枚举数不赋值,则默认为0,其后不赋值则默认增加1。遇到中间赋值的则重新计算。即除对于不赋值的枚举数,默认比他前一个枚举数增加1。
定义枚举类型是,对枚举数的赋值必须是整数类型或是识别为整数类型的字面量,例如:
enum DAY {
a = 10,b = 123.45,c = 'a',d = "abc"};
// b和d的赋值出错(这里"abc"也不能得到字符串的起始地址)
可以在定义枚举类型的同时直接定义枚举变量(其他自定义类型也有这个特性):
enum DAY {
a = 10,b = 20,c = 30,d = 40} day,dday; // enum DAY类型变量
也可以直接定义有某种结构但无名的枚举类型变量(其他自定义类型也有这个特性):
enum {
a = 10,b = 20,c = 30,d = 40} day,dday; //enum <unnamed> 类型变量
显然这种枚举变量只能在第一次时定义,之后不能直接使用这个枚举类型定义新的变量。
枚举数的标识符不能是已经定义的变量名,也不能在枚举类型定义之后再使用枚举数标识符定义其他变量,例如:
int a = 1;
enum DAY {
a = 10, b = 20, c = 30, d = 40 }; // a重定义
int b = 2; // b重定义
一个枚举变量如果不赋初始值,则不会给出默认值,和一个不赋初始值的普通变量一样。
枚举变量本身的类型是定义它的枚举的类型,但可以将一个枚举变量当作整数参与运算或赋值给其他变量,例如:
enum DAY {
a = 10, b = 20, c = 30, d =