《第七章结构与联合.ppt》由会员分享,可在线阅读,更多相关《第七章结构与联合.ppt(57页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第七章 结构与联合【教学目的与要求】【教学目的与要求】【教学目的与要求】【教学目的与要求】理理解解结结构构和和联联合合的的定定义义和和使使用用方方法法,掌掌握握结结构构成成员员和访问方法,结构数组的使用。和访问方法,结构数组的使用。【教学重点与难点】【教学重点与难点】【教学重点与难点】【教学重点与难点】结结构构的的定定义义和和使使用用,链链表表的的建建立立和和操操作作、结结构构数数组组的使用。的使用。【教学方法】【教学方法】【教学方法】【教学方法】讲授与上机相结合。讲授与上机相结合。7.1 结构体的定义7.2 结构体变量的定义7.3 结构体成员的访问7.4 结构数组与程序举例7.5 结构与函数
2、7.6 结构与链表7.7 联合本章内容7.1 结构体的定义及引用问题提出有时候需要将不同类型的数据组合成一个有机的整体将不同类型的数据组合成一个有机的整体将不同类型的数据组合成一个有机的整体将不同类型的数据组合成一个有机的整体,这些组合在一个整体中的数据是互相联系的。如一个学生的信息包括学号、姓名、性别、年龄、成绩、地址等。numnamesexagescoreaddr5001Li MingM1996.5Chengduint num;char name20;char sex;int age;float score;char addr30;应当把它们组织成一个组合项,在一应当把它们组织成一个组合项
3、,在一个组合项内包含若干个类型不同个组合项内包含若干个类型不同(或相同或相同)的数据项。的数据项。语言提供了这种数据结构:允许用允许用户将不同类型的数据组合成一个有机的整户将不同类型的数据组合成一个有机的整体,这些数据互相联系体,这些数据互相联系;这种数据结构称为结构体结构体结构体结构体(structure)。7.1.1 结构定义的格式所谓结构体的定义,是指定义相应的数据结构及相应的变量。步骤步骤:、先定义一个结构体类型标识符先定义一个结构体类型标识符;、用该标识符去定义相应的变量用该标识符去定义相应的变量。struct student int num;char name20;char sex
4、;int age;float score;char addr30;;说明:说明:说明:说明:、structstruct是关键字,不能省略是关键字,不能省略是关键字,不能省略是关键字,不能省略:表示将要进行结构体的定义;、student是用户自己定义的结构体类型标识符,即该结构体名;、结构体中具体每项的定义,由 和 括起来。语言中把用户自己定义的数据项称为成员成员(或称为域域),即每个成员也叫结构体中的一个域。最后以“;”结束结构的定义。定义一个结构体类型的一般形式:定义一个结构体类型的一般形式:structstruct 结构体类型标识符结构体类型标识符结构体类型标识符结构体类型标识符 类型标识
5、符1成员名1;类型标识符2成员名2;类型标识符n成员名n;结构体名结构体名结构体名结构体名成成员员表表列列说明:说明:说明:说明:、“结构体名结构体名”用作结构体用作结构体类型的标志类型的标志;、大括弧内是该结构体中的各个成员,由它们组成一个结构体;在结构体内对各成员都在结构体内对各成员都在结构体内对各成员都在结构体内对各成员都应进行类型声明应进行类型声明应进行类型声明应进行类型声明;、“成员表列”也称为域表域表域表域表。每个成员也称为结构体中的一个域,成员成员名命名规则与变量名一样名命名规则与变量名一样;、每个成员名前的类型标识符可以为已经定义了的任意类型,当然可以是结构体类型标识符,即结构
6、体成员也可以是另一个结构体变量结构体成员也可以是另一个结构体变量结构体成员也可以是另一个结构体变量结构体成员也可以是另一个结构体变量。、此处只是构造出一个新的类型,并没有定义该类型的变量,因此在内在内在内在内存中并没有开辟任何存储空间存中并没有开辟任何存储空间存中并没有开辟任何存储空间存中并没有开辟任何存储空间;、在程序中可以定义多个结构体类型,不同结构体类型用不同的结构体在程序中可以定义多个结构体类型,不同结构体类型用不同的结构体名来区分名来区分。1、定义形式:定义形式:定义形式:定义形式:struct 结构体类型标识符结构体类型标识符结构体类型标识符结构体类型标识符变量名列表变量名列表变量
7、名列表变量名列表;注意注意:struct可省略可省略。2、定义结构体变量的三种方法:定义结构体变量的三种方法:定义结构体变量的三种方法:定义结构体变量的三种方法:、先定义结构体类型再定义变量名先定义结构体类型再定义变量名先定义结构体类型再定义变量名先定义结构体类型再定义变量名struct student int num;char name20;float score;;structstruct student student stu1,stu2;结构体类型名结构体类型名结构体类型名结构体类型名结构体变量名结构体变量名结构体变量名结构体变量名10001Zhang9210002Li97stu1st
8、u2在定义了结构体变量后,系统会为之分配内存单元。在定义了结构体变量后,系统会为之分配内存单元。sizeof(stu1)=2+20+4=26267.2 结构体变量的定义和初始化、在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量structstruct 结构体类型标识符结构体类型标识符结构体类型标识符结构体类型标识符 类型标识符1成员名1;类型标识符2成员名2;类型标识符n成员名n;变量名列表变量名列表变量名列表变量名列表;struct student int num;char name20;float score;stu1
9、,stu2;、直接定义结构体类型变量直接定义结构体类型变量直接定义结构体类型变量直接定义结构体类型变量structstruct 类型标识符1成员名1;类型标识符2成员名2;类型标识符n成员名n;变量名列表变量名列表变量名列表变量名列表;(不出现结构体类型名不出现结构体类型名不出现结构体类型名不出现结构体类型名)struct int num;char name20;float score;stu1,stu2;4、关于结构体类型的几点说明:关于结构体类型的几点说明:关于结构体类型的几点说明:关于结构体类型的几点说明:、类型与变量是不同的概念,不要混淆:a、只能对变量赋值、存取或运算,而不能对一个类
10、型赋值、存取或运算;只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算;b、在编译时,对类型不分配内存空间,只对变量分配空间。在编译时,对类型不分配内存空间,只对变量分配空间。在编译时,对类型不分配内存空间,只对变量分配空间。在编译时,对类型不分配内存空间,只对变量分配空间。、只有在定义变量后,才为该变量开辟存储单元只有在定义变量后,才为该变量开辟存储单元只有在定义变量后,才为该变量开辟存储单元只有在定义变量后,才为该变量开辟存储单元。结构体结构体结构体结构体变量所占的内存长度等于每个成员长度之和变量所占的内存长度等于每个成员长度之和变量所占的内存长度等于每个成员长度之和变量所占的内
11、存长度等于每个成员长度之和;struct student int num;char name20;float score;;sizeof(struct struct studentstudent)=26=26、对结构体中的成员结构体中的成员结构体中的成员结构体中的成员(“(“域域域域”)”),可以单独使用,可以单独使用,可以单独使用,可以单独使用,它的作用与地位相当于普通变量;、成员也可以是一个已定义的结构体类型变量成员也可以是一个已定义的结构体类型变量成员也可以是一个已定义的结构体类型变量成员也可以是一个已定义的结构体类型变量:struct date int year;int month;i
12、nt day;struct student int num;char name20;char sex;struct date birthday;char addr30;sizeofsizeof(structstruct student student)=)=?、成员也可以是指向本结构体类型的指针变量成员也可以是指向本结构体类型的指针变量成员也可以是指向本结构体类型的指针变量成员也可以是指向本结构体类型的指针变量;struct struct studentstudent int num;char name20;float score;structstruct student student*ne
13、xt*next;、成员名可以与程序中的变量名相同成员名可以与程序中的变量名相同成员名可以与程序中的变量名相同成员名可以与程序中的变量名相同,二者不代表同一对象。7.3 结构体成员的访问1、直接访问:直接访问:直接访问:直接访问:结构体变量名结构体变量名结构体变量名结构体变量名.成员名成员名成员名成员名“.”是是成员运算符成员运算符,在所有的运算符中优先级最高。,在所有的运算符中优先级最高。struct student int num;char name20;float score;stu1,stu2;stu1.num=10001;stu1.score=95;stu1.name=Li Ming;
14、strcpystrcpy(stu1.name,Li Ming);2、间接访问间接访问间接访问间接访问结构体变量的指针:结构体变量的指针:结构体变量的指针:结构体变量的指针:就是该变量所占据的内存段的起始地址。就是该变量所占据的内存段的起始地址。就是该变量所占据的内存段的起始地址。就是该变量所占据的内存段的起始地址。struct struct studentstudent stustu,*p*p;p=&stu;对结构体成员的访问有以下三种形式:Eg901.Eg901.cppcpp、stustu.numnum、stustu.namename、stustu.scorescore、(*p*p).num
15、num、(*p*p).namename、(*p*p).scorescore、p p-numnum、p p-namename、p p-scorescore“-”为指向运算符指向运算符指向运算符指向运算符,是优先级最高的运算符;3、只有在对结构体变量只有在对结构体变量只有在对结构体变量只有在对结构体变量赋值赋值赋值赋值或或或或作为函数参数作为函数参数作为函数参数作为函数参数时才可以对一个时才可以对一个时才可以对一个时才可以对一个结构体变量进行整体操作;结构体变量进行整体操作;结构体变量进行整体操作;结构体变量进行整体操作;(赋值时要求具有相同结构赋值时要求具有相同结构赋值时要求具有相同结构赋值时要
16、求具有相同结构)注1、不能将一个结构体变量作为一个整体进行输入输出:不能将一个结构体变量作为一个整体进行输入输出:不能将一个结构体变量作为一个整体进行输入输出:不能将一个结构体变量作为一个整体进行输入输出:coutstu1);只能对结构体中的各个成员分别进行输入输出。只能对结构体中的各个成员分别进行输入输出。只能对结构体中的各个成员分别进行输入输出。只能对结构体中的各个成员分别进行输入输出。cout stu1stu1.numnum stu1stu1.namenamestu1stu1.numnum);getsgets(stu1stu1.namename););Eg901.Eg901.cppcpp
17、stu2stu2=stu1;stu1;stu2.num=stu1.num;strcpy(stu2,name,stu1.name);stu2.score=stu1.score;void fun(void fun(structstruct student student pxpx););fun(fun(stu1stu1););7.3 结构体变量的访问成员名也是一个变量成员名也是一个变量成员名也是一个变量成员名也是一个变量(称为称为称为称为成员变量成员变量成员变量成员变量),具有自己的数据,具有自己的数据,具有自己的数据,具有自己的数据类型,使用与同类型的变量相同。类型,使用与同类型的变量相同。类型
18、,使用与同类型的变量相同。类型,使用与同类型的变量相同。注2、如果成员本身又属于一个结构体类型,则要用若干个成如果成员本身又属于一个结构体类型,则要用若干个成如果成员本身又属于一个结构体类型,则要用若干个成如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级的找到最低一级的成员。员运算符,一级一级的找到最低一级的成员。员运算符,一级一级的找到最低一级的成员。员运算符,一级一级的找到最低一级的成员。只能对最低只能对最低只能对最低只能对最低一级的成员进行赋值、存取或运算一级的成员进行赋值、存取或运算一级的成员进行赋值、存取或运算一级的成员进行赋值、存取或运算;stu1.birthda
19、y.year=2002;注3、对对对对成员变量可以像普通变量一样进行各种运算成员变量可以像普通变量一样进行各种运算成员变量可以像普通变量一样进行各种运算成员变量可以像普通变量一样进行各种运算(根据其类根据其类根据其类根据其类型决定可以进行的运算型决定可以进行的运算型决定可以进行的运算型决定可以进行的运算)sum=stu1.score+stu2.score;stu1.age+;注4、可以引用结构体变量成员的地址,也可以引用结构体变可以引用结构体变量成员的地址,也可以引用结构体变可以引用结构体变量成员的地址,也可以引用结构体变可以引用结构体变量成员的地址,也可以引用结构体变量的地址;量的地址;量的
20、地址;量的地址;int*p=&stu1.num&stu1.num;student*p=&stustu);结构体变量的地址主要用于作函数参数,传递结构体变量的地址;结构体变量的地址主要用于作函数参数,传递结构体变量的地址;结构体变量的地址主要用于作函数参数,传递结构体变量的地址;结构体变量的地址主要用于作函数参数,传递结构体变量的地址;注5、在定义结构体变量的同时,可以进行初始化。在定义结构体变量的同时,可以进行初始化。在定义结构体变量的同时,可以进行初始化。在定义结构体变量的同时,可以进行初始化。struct student int num;char name20;char sex;char
21、addr30;stu=15001,宋 红,M,123 Road Beijing;注意:结构体变量的注意:结构体变量的注意:结构体变量的注意:结构体变量的各个初值用大括号各个初值用大括号各个初值用大括号各个初值用大括号、括起来括起来括起来括起来,大括号,大括号,大括号,大括号内各个内各个内各个内各个成员变量的值之间用逗号分隔成员变量的值之间用逗号分隔成员变量的值之间用逗号分隔成员变量的值之间用逗号分隔,其值必须与成,其值必须与成,其值必须与成,其值必须与成员变量一一对应,且员变量一一对应,且员变量一一对应,且员变量一一对应,且数据类型应与成员变量一致数据类型应与成员变量一致数据类型应与成员变量一
22、致数据类型应与成员变量一致。Eg902.Eg902.cppcpp例例例例7.17.1:输入输入输入输入5 5名学生的学号及成绩,求成绩最好的学生的学号及成绩。名学生的学号及成绩,求成绩最好的学生的学号及成绩。名学生的学号及成绩,求成绩最好的学生的学号及成绩。名学生的学号及成绩,求成绩最好的学生的学号及成绩。7.4 结构体数组与程序举例数组的每个元素都是结构体类型的数据,它们分别包数组的每个元素都是结构体类型的数据,它们分别包数组的每个元素都是结构体类型的数据,它们分别包数组的每个元素都是结构体类型的数据,它们分别包含各个成员项。含各个成员项。含各个成员项。含各个成员项。7.4.1 结构体数组的
23、定义1、先定义结构体类型,再定义结构体数组先定义结构体类型,再定义结构体数组先定义结构体类型,再定义结构体数组先定义结构体类型,再定义结构体数组struct struct student student int num;float score;struct struct student student stustu3030;2、定义结构体类型的同时定义结构体数组定义结构体类型的同时定义结构体数组定义结构体类型的同时定义结构体数组定义结构体类型的同时定义结构体数组struct struct student student int num;float score;stustu3030;3、直接定义
24、结构体数组直接定义结构体数组直接定义结构体数组直接定义结构体数组structstruct int num;float score;stustu3030;7.4.2 结构体数组的初始化一般形式:一般形式:一般形式:一般形式:struct 结构体类型标识符结构体类型标识符结构体类型标识符结构体类型标识符类型标识符1成员名1;类型标识符2成员名2;类型标识符n成员名n;结构体数组结构体数组=数组元素数组元素0 0的各个初值的各个初值,数组元素数组元素1 1的各个初值的各个初值,;例:例:例:例:struct student int num;char name20;float score;stustu
25、33=1010110101,Li MingLi Ming,8888,1010210102,Zhang JinZhang Jin,92,92,10103 10103,Wang Lin Wang Lin,98.5 98.5;说明:说明:说明:说明:1、初始化时,数组元素的个数可以不指定,系统会根据初值初始化时,数组元素的个数可以不指定,系统会根据初值的结构体常量的个数来确定数组元素的个数的结构体常量的个数来确定数组元素的个数;struct struct student student int int num;num;char name20;char name20;float score;float
26、 score;stustu =1010110101,Li MingLi Ming,8888,1010210102,Zhang JinZhang Jin,9292,1010310103,Wang Lin Wang Lin,98.5 98.5 ;student stu1 student stu1=1010110101,Li MingLi Ming,8888,1010210102,Zhang JinZhang Jin,9292,1010310103,Wang Lin Wang Lin,98.5 98.5 ;2、数组中各个元素的初值用大括号数组中各个元素的初值用大括号、括起来,同一数组元素括起来,同一
27、数组元素的各个成员变量的初值用逗号分隔。必须在初始化时完成。的各个成员变量的初值用逗号分隔。必须在初始化时完成。7.4.3应用举例 例7-1、若有如下定义:struct struct aaaa long num;long num;char name20;char name20;struct struct bb bb int int age;age;structstruct aaaa first;first;stustu2;2;、要给要给要给要给stustu11输入输入输入输入1818、990001990001、zhang huazhang hua bin bin,写出所用写出所用写出所用写出所
28、用到的语句;到的语句;到的语句;到的语句;、如何如何如何如何将将将将stustu11中的名字复制到中的名字复制到中的名字复制到中的名字复制到stustu00中的相应位置上?中的相应位置上?中的相应位置上?中的相应位置上?、输出输出输出输出stustu 的值。的值。的值。的值。(1)(1)定义时初始化:定义时初始化:bb bb stustu2=0,0,18,990001,2=0,0,18,990001,zhang huazhang hua bin bin;(2)(2)程序中初始化程序中初始化Eg903.Eg903.cppcpp7.4.3应用举例/li7-1./li7-1.cppcpp#inclu
29、de#include.h#include#includestruct aastruct aa long num;long num;char name20;char name20;struct struct bb bb int int age;age;structstruct aaaa first;first;stustu2;2;void main()void main()stustu1.age=18;1.age=18;stustu1.first.num=990001;1.first.num=990001;strcpystrcpy(stustu1.first.name,1.first.name,
30、zhang zhang huahua bin);bin);Eg903.Eg903.cppcpp运行结果:00zhang hua bin18990001zhanghua binstrcpystrcpy(stustu0.first.name,0.first.name,stustu1.first.1.first.name);name);for(for(intint i=0;i2;i+)i=0;i2;i+)coutcoutstustui.agei.agestustui.first.numi.first.numstustui.first.namei.first.namenum(+p)-num先使先使先使
31、先使p p自加自加自加自加1 1,然后得到它指向元素的,然后得到它指向元素的,然后得到它指向元素的,然后得到它指向元素的numnum成员值成员值成员值成员值+p-nump-num使使使使p p指向的结构体变量中的成员指向的结构体变量中的成员指向的结构体变量中的成员指向的结构体变量中的成员numnum的值加的值加的值加的值加1 1(p+)-num(p+)-num先得到先得到先得到先得到p-nump-num的值,然后使的值,然后使的值,然后使的值,然后使p p自加自加自加自加1 1,指向,指向,指向,指向stustu11p-nump-num+使使使使p p指向的结构体变量中的成员指向的结构体变量中
32、的成员指向的结构体变量中的成员指向的结构体变量中的成员numnum的值加的值加的值加的值加1 1、若、若p p已定义为指向结构体类型的数据,则已定义为指向结构体类型的数据,则p p只能指向相应类只能指向相应类型的变量或数组元素,不能指向数组元素中的某一成员;型的变量或数组元素,不能指向数组元素中的某一成员;Eg905.Eg905.cppcpp2.结构体数组的指针实现结构数组排序设结构数组用设结构数组用a a表示,结构指针数组用表示,结构指针数组用b b表示,表示,b b中每个元中每个元素素bibi的初值为的初值为&aiai。则则b b为指针数组,它的每一个成员是一为指针数组,它的每一个成员是一
33、个指针,指向个指针,指向a a数组的的一个结构元素。数组的的一个结构元素。用结构体数组指针访问结构体数组成员:用结构体数组指针访问结构体数组成员:如:如:bi-grade;/bibi-grade;/bi指向的结构数组元素中的指向的结构数组元素中的gradegrade成员。成员。程序说明程序说明程序说明程序说明li7-6.li7-6.cppcpp:、结构体数组指针的定义、结构体数组指针的定义Student*b;Student*b;*b=new Student*n;/*b=new Student*n;/动态分配一个具有动态分配一个具有n n个元素的个元素的 /结构指针数组结构指针数组for(i=1
34、;in;i+)bi=&ai;for(i=1;i0)while(n-0)IntNodeIntNode*p=new*p=newIntNodeIntNode;cincinp-data;p-data;p-next=f;p-next=f;f=p;f=p;Eg906.Eg906.cppcpp22、建立链表、建立链表、建立链表、建立链表7.6 结构与链表向表尾插入新结点:voidcreate(voidcreate(IntNodeIntNode*&f,*&f,intintn)n)intintx;x;cincinx;x;f=newf=newIntNodeIntNode;f-data=x;f-next=Null;
35、f-data=x;f-next=Null;/建立表头结点建立表头结点建立表头结点建立表头结点IntNodeIntNode*p=f;/p*p=f;/p指向表头结点指向表头结点指向表头结点指向表头结点frfr(intinti=1;i=n-1;i+)i=1;ix;p-next=newx;p-next=newIntNodeIntNode;p=p-next;p-data=x;p=p-next;p-data=x;p-next=NULL;p-next=NULL;注:f引用调用,指向表头结点voidprint(voidprint(IntNodeIntNode*f)*f)while(f!=NULL)while(
36、f!=NULL)coutcoutdatanext;datanext;voidmain()voidmain()IntNodeIntNode*p1;create(p1,5);/*p1;create(p1,5);/返回表头结点指针返回表头结点指针返回表头结点指针返回表头结点指针p1p1coutcoutendlendl;print(p1);print(p1);/输入输入输入输入1234512345输出输出输出输出5432154321程序:程序:程序:程序:P210P210:Eg906.Eg906.cppcpp3 3、遍历一个链表遍历一个链表遍历一个链表遍历一个链表链表具有顺序存取特性:当访问一个链表时
37、,必须从表链表具有顺序存取特性:当访问一个链表时,必须从表链表具有顺序存取特性:当访问一个链表时,必须从表链表具有顺序存取特性:当访问一个链表时,必须从表头指针出发顺序进行。头指针出发顺序进行。头指针出发顺序进行。头指针出发顺序进行。7.6 结构与链表C+C+操作符不仅能够用于预定义数据类型,经操作符重载函数定义后,操作符不仅能够用于预定义数据类型,经操作符重载函数定义后,操作符不仅能够用于预定义数据类型,经操作符重载函数定义后,操作符不仅能够用于预定义数据类型,经操作符重载函数定义后,也可以用于用户自定义数据类型。也可以用于用户自定义数据类型。也可以用于用户自定义数据类型。也可以用于用户自定
38、义数据类型。Eg906.Eg906.cppcppC+C+有两种形式的重载:有两种形式的重载:有两种形式的重载:有两种形式的重载:1.1.函数重载函数重载函数重载函数重载:相同作用域内,若干参数特征不同的函数使用相同作用域内,若干参数特征不同的函数使用相同的函数名。相同的函数名。2.2.运算符重载运算符重载运算符重载运算符重载:同样的运算符可以施加于不同类型的操作符上同样的运算符可以施加于不同类型的操作符上面,提高语言的灵活性和可扩充性,实现多态。面,提高语言的灵活性和可扩充性,实现多态。7.7 结构与操作符重载如:分数结构类型 struct Fran int nu;int de;若:定义 Fr
39、an a=2,3,b=3,4,c;a=2,3,b=3,4,c;欲实现 c=a+b=17,12a+b=17,12?voidvoidFranSimpFranSimp(Fran&x)(Fran&x)intintm,n,r;m,n,r;m=x.m=x.nunu;n=x.de;n=x.de;r=m%n;r=m%n;While(r!=0)While(r!=0)m=n;n=r;r=m%n;/m=n;n=r;r=m%n;/求最大公约数求最大公约数求最大公约数求最大公约数if(n!=1)if(n!=1)x.x.nunu/=n;x.de/=n;/=n;x.de/=n;/化简化简化简化简if(x.de0)if(x.
40、de0)x.x.nunu=-x.=-x.nunu;x.de=-x.de;/;x.de=-x.de;/分母为负处理分母为负处理分母为负处理分母为负处理 Eg906.Eg906.cppcppFranFranFranAddFranAdd(constFran&a,constFran&b)(constFran&a,constFran&b)Franc;Franc;c.c.nunu=a.=a.nunu*b.de+b.*b.de+b.nunu*a.de;*a.de;c.de=a.de*b.de;c.de=a.de*b.de;FranSimpFranSimp(c);/(c);/对结果进行简化处理。对结果进行简化
41、处理。对结果进行简化处理。对结果进行简化处理。Returnc;Returnc;7.7.1函数实现函数实现函数调用:C=FranAdd(a,b);思考:判断两个分数是否相等。写出函数重载运算符 程序举例:P215 双目双目双目双目操作符重载函数的定义格式:操作符重载函数的定义格式:operator(,)调用:调用:调用:调用:2Eg906.Eg906.cppcppFranoperator+(constFran&a,constFran&b)Franoperator+(constFran&a,constFran&b)Franc;Franc;c.c.nunu=a.=a.nunu*b.de+b.*b.d
42、e+b.nunu*a.de;*a.de;c.de=a.de*b.de;c.de=a.de*b.de;FranSimpFranSimp(c);/(c);/对结果进行简化处理。对结果进行简化处理。对结果进行简化处理。对结果进行简化处理。Returnc;Returnc;7.7.2操作符重载函数实现操作符重载函数实现欲将上述运算写成:欲将上述运算写成:欲将上述运算写成:欲将上述运算写成:c=a+b,c=a+b,如何实现。如何实现。如何实现。如何实现。使用使用使用使用操作符重载函数操作符重载函数operater调用:c=a+b;Eg906.Eg906.cppcppFranoperator-(constF
43、ran&x,Franoperator-(constFran&x,intint)Frany=x;Frany=x;x.x.nunu+=x.de;+=x.de;Returny;/Returny;/使使使使x x加加加加1 1,返回,返回,返回,返回x x的原值的原值的原值的原值 7.7.2操作符重载函数实现操作符重载函数实现单目单目单目单目操作符重载函数的定义格式:操作符重载函数的定义格式:operator()调用:调用:调用:调用:2例:例:+x例:x+Franoperator+(constFran&x)Franoperator+(constFran&x)x.x.nunu+=x.de;+=x.de
44、;ReturnxReturnx;/x;/x先加先加先加先加1 1,返回,返回,返回,返回x x的引用的引用的引用的引用 voidvoidFranInputFranInput(Fran&x)(Fran&x)charcharchch;CinCinx.x.nunuchxchx.de;.de;if(x.de=0)if(x.de=0)CerrCerr“除数为除数为除数为除数为0”0”(&operator(istreamistream&istristr,Fran&x),Fran&x)charcharchch;istristrx.x.nunuchxchx.de;.de;if(x.de=0)if(x.de=0
45、)CerrCerr“除数为除数为除数为除数为0”0”运算符运算符左操作数是标准输入流类型istream对象,如cin右操作数是自定义结构类型变量:ostreamostream&operator(&operator(ostreamostream&ostrostr,Fran&x),Fran&x)charcharchch;ostrostrx.x.nunu/x.de/x.deendlendl;returnreturnostrostr;Eg906.Eg906.cppcpp7.7.3输入输出重载实现输入输出重载实现3.重载重载SunworkdaySun)5 5、一个整数不能直接赋给一个枚举变量、一个整数不
46、能直接赋给一个枚举变量workday=2;workday=(enum weekday)2;workday=(enum weekday)(x-y);例:例:例:例:从键盘输入从键盘输入0 06 6的任意整数,的任意整数,0 0表示星期日,表示星期日,1 16 6分别表分别表示星期一到星期六,要求编写程序输出对应的英文名称。示星期一到星期六,要求编写程序输出对应的英文名称。enum enum weekdaySunday,Monday,Tuesday,Wednesday,Thursday,weekdaySunday,Monday,Tuesday,Wednesday,Thursday,Friday,S
47、aturdayFriday,Saturdayweekweek;scanf(%d,&i);switch(i)switch(i)case 0:week=Sunday;break;case 0:week=Sunday;break;case 1:week=Monday;break;case 1:week=Monday;break;case 2:week=Tuesday;break;case 2:week=Tuesday;break;case 3:week=Wednesday;break;case 3:week=Wednesday;break;case 4:week=Thursday;break;cas
48、e 4:week=Thursday;break;case 5:week=Friday;break;case 5:week=Friday;break;case 6:week=Saturday;break;case 6:week=Saturday;break;switch(switch(weekweek)case case SundaySunday:break;:break;case case MondayMonday:break;break;case case TuesdayTuesday:break;:break;case case WednesdayWednesday:break;:brea
49、k;case case ThursdayThursday:break;:break;case case FridayFriday:break;:break;case case SaturdaySaturday:break;:break;9.7 类型标识符的自定义1 1、除了可以直接使用提供的标准类型名、除了可以直接使用提供的标准类型名(intint、charchar、floatfloat等等)和自己定义的数据类型和自己定义的数据类型(结构体、共用体、指针、枚举结构体、共用体、指针、枚举类型类型)外,还可以外,还可以用用用用typedeftypedef声明新的类型名来代替已有的声明新的类型名来代
50、替已有的声明新的类型名来代替已有的声明新的类型名来代替已有的类型名类型名类型名类型名。typedef typedef intint INTEGERINTEGERintint i,*p;i,*p;INTEGERINTEGER i,*p;i,*p;typedef typedef floatfloat REALREALfloatfloat x,y;x,y;REALREAL x,y;x,y;2 2、定义类型标识符的方法:、定义类型标识符的方法:、按定义变量的方式写出定义体:、按定义变量的方式写出定义体:、按定义变量的方式写出定义体:、按定义变量的方式写出定义体:float x;float x;、将变量