C/C++自定义数据类型
C/C++自定义数据类型
附录 A 给出了C/C++的各种预定义数据类型,这些数据类型满足了程序设计中基本的、常用的数据表示和运算实现需求。但是,为了方便设计与操作,在进行复杂的程序设计、实现复杂的算法时,通常需要将基本数据类型组合起来,定义各种新的数据类型来描述和操作复杂的客观事物。结构(Struct)、枚举(Enum)、联合(Union)、类(Class)是C/C++语言常用的4 种用来自定义数据类型的类别。
1.6.1 结构
程序描述:该程序定义、实现了一种结构类别的自定义数据类型:point,并应用它实现了求解平面上两个坐标点的中点坐标的算法。
【源程序1-7】
01 #include
02 using namespace std;
03 struct point{
04 double x;
05 double y;
06 };
07
08 point getMedian(point ,point);
09
10 main()
11 {
12 point pt1;
13 point pt2;
14 point median;
15 cout<<"Enter the x and Y coordiates for point #1:";
16 cin>>pt1.x>>pt1.y;
17 cout<<"Enter the x and y coordinates for point #2:";
18 cin>>pt2.x>>pt2.y;
19 median=getMedian(pt1,pt2);
20 cout<<"Mid point is ("<
21 return 0;
22 }
23
24 point getMedian(point p1,point p2)
25 {
26 point result;
27 result.x=(p1.x+p2.x)/2;
28 result.y=(p1.y+p2.y)/2;
29 return result;
30 }
程序说明:
(1) 第3~6 行定义了一个结构类别的自定义数据类型:point,它是由两个具有预定义数据类型的成员变量x 和y 组合成的新的用户自定义数据类型。习惯上也简称这种结构类别的用户自定义数据类型point 为“结构体point”。本教材来自:http://www.isstudy.com
(2) 第12~14 行定义了3 个point 类型的结构体变量pt1,pt2 和median。
(3) 第16~18 行分别引用了结构体变量pt1 和pt2 中的成员变量x 和y,并分别对它们赋了值。
(4) 第24~30 行定义了point 类型的函数getMedian(),该函数的作用是求两坐标点p1 和p2 的中点,并返回该中点的坐标。
知识点:
(1) 定义结构体类型的语法如下:
struct 结构体名 {成员列表} 变量列表;
(2) 结构体声明时本身不占用内存空间,只有用该结构体声明变量时系统才会为所声明的结构体变量分配存储单元,一个结构体变量所占存储单元的个数等于其各成员变量所占存储单元个数之和。
(3) 不能将一个结构体变量作为一个整体来处理,处理结构体变量成员变量的方法是“结构体变量名.成员变量名”,其中的“.”称为成员变量提取符。
1.6.2 枚举
程序描述:该程序定义、实现了一种枚举类别的自定义数据类型 mathError,并应用它实现了一种通过运行时刻输入预定义种类运算符、正确实现动态运算的方法。
【源程序1-8】
01 #include
02 using namespace std;
03 enum mathError {noError ,badOperator ,divideByZero};
04 void sayError(mathError err)
05 {
06 switch(err){
07 case noError:
08 cout<<"No error";
09 break;
10 case badOper ator:
11 cout<<"Enter:invalid operator";
12 case divideByZero:
13 cout<<"Error:attempt to divide by zero";
14 }
15 }
16
17 int main()
18 {
19 double x,y,z;
20 char op;
21 mathError error=noError;
22 cout<<"Enter a numbver ,an operator, and a number:";
23 cin>>x>>op>>y;
24
25 switch(op){
26 case'+':
27 z=x+y;
28 break;
29 case'-':
30 z=x-y;
31 break;
32 case'*':
33 z=x*y;
34 break;
35 case'/':
36 if(y!=0)
37 z=x/y;
38 else
39 error=divideByZero;
40 break;
41 default:
42 error=badOperator;
43 }
44
45 if(error==noError)
46 cout<
47 else
48 sayError(error);
49
50 return 0;
51 }
程序说明:
(1) 第3 行定义了一个枚举类别的自定义数据类型:mathError,它规定了3 种枚举取值:
{noError,badOperator,divideByZero}。
(2) 第4~16 行定义了sayError()函数,该函数的作用是根据其枚举类型的形式参数err 的值给出选择性的输出结果。
(3) 第17~51 行定义了main()函数。其中第25~43 行为一个switch 语句,该语句的作用是根据输入的赋值给字符型变量op 的操作符类型,对x 和y 进行不同的操作。第36~40 行处理了除数为0 的情况。
(4) 第48 行调用sayError 函数,给出处理结果。
知识点:
(1) 定义枚举类别数据类型的语法如下:
enum 枚举类别数据类型名称 {枚举常量列表}
(2) 枚举实际上就是事先规定好特定类型变量的几种可能取值,本例第3 行定义的枚举类别的数据类型mathError 就表示程序中用mathError 声明的变量,不管如何参与运算、如何赋值,其取值只允许接受mathError 定义时规定好的{noError,badOperator,divideByZero}3 种可能取值中的某种,例如:
mathError error1=noError; //正确
mathError error1=MaynoError; //错误,为枚举型变量所赋的值不在规定取值范围内
mathError error2=0; //错误,不允许用位置编号赋值
(3) 枚举型变量的可能取值是在定义该枚举数据类型时规定好的,用符号表示各个枚举值,在系统内以整型数表示。如果未指定,则第一个符号常量的枚举值就是0,其他枚举值依次加1。系统内部会按照位置顺序给各种取值编号,如{noError=0,badOperator=1,divideByZero=2},输出枚举变量值时也是输出其位置编号,实际上系统内部真正存储和操作的枚举变量值是其位置编号值。本教材来自:http://www.isstudy.com
1.6.3 联合
程序描述:该程序定义、实现了一种联合类别的自定义数据类型myunion,并演示了它的一种简单应用。
【源程序1-9】
01 #include
02 using namespace std;
03 union myunion
04 { int a;
05 char ch[2];
06 } ;
07
08 int main()
09 {
10 myunion au;
11 au.a=298;
12
13 cout<
14
15 return 0;
16 }
程序说明:
(1) 第3~6 行定义了一个联合类别的自定义数据类型:myunion,它有两个成员变量,一个是int 型的a,另一个是char 型的ch,这两个成员变量在生成变量时将共用一个存储单元,单元大小由需要最大存储单元的成员变量决定。
(2) 第10 行用此自定义数据类型声明了一个变量au。
(3) 第11 行为成员变量a 赋值为298。由于数组ch 和a 共用存储单元,因此,数组ch 也被初始化并赋值了,从第13 行的输出结果可以看出。
知识点:
本教材来自:http://www.isstudy.com
(1) 定义联合类别数据类型的语法如下:
union 联合类别数据类型名称 {成员列表} 变量列表;
(2) 一个联合类别数据类型变量在系统中占用的存储单元长度由需要最大存储单元的成员变量决定。
(3) 不能将一个联合类别数据类型变量作为一个整体来处理,处理联合体变量成员的方法是“联合类别数据类型变量名.成员名”。
(4) 由于联合类别数据类型变量的所有成员变量共同占用相同的存储空间,因此,在对联合类别数据类型变量进行初始化时,不能初始化全部成员。例如:
union data
{ char c;
float f;
} a={'n', 3.14}; //错误