C++自定义数据类型.ppt_第1页
C++自定义数据类型.ppt_第2页
C++自定义数据类型.ppt_第3页
C++自定义数据类型.ppt_第4页
C++自定义数据类型.ppt_第5页
已阅读5页,还剩34页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、,自定义数据类型,思考:请大家定义一个学生变量,能够描述你的姓名、学号、宿舍地址、联系电话、出生 年月。,在前面章节里所使用的数据(整型、字符、浮点型)是C+预先定义的基本数据类型,但是在有些时候,仅用这些基本数据很难描述清楚客观世界。 在程序开发过程中,经常遇到要处理的对象用C+预先定义的基本数据类型不能全面描述的情况。 C+允许我们自己定义数据类型,通过自定义数据类型来更好的描述客观世界 。,结构,C+允许程序员使用结构这种自定义的数据类型来解决这个矛盾。 通过结构,可以将C+的基本数据类型组合起来形成一个有机的整体来描述具体的对象。不论要描述的对象有多么复杂,只需要把它的属性抽象出来,然

2、后用C+的基本数据类型来描述,就可以把这个对象很好地描述清楚。,结构的定义,结构定义的一般形式是: struct 结构名 数据类型成员名1; 数据类型成员名2; 数据类型成员名n; ;,前面提到的可以用于描述学生信息的结构定义如下: struct Student intnID; charszName20; charszAddr100; char szBirthday10; charszPhone15; floatfScore; ;/注意,“;”表示结构定义结束。,在定义结构的成员时,成员的数据类型可以是任何一个C+的基本数据类型,或者是自定义的数据类型。 也就是说结构的成员可以是另外一个结构或

3、者其他复杂的自定义的数据类型。通过这样的组合关系,C+可以用结构描述非常复杂的数据对象。 在定义结构的成员时,成员的命名规则和普通变量的命名规则是一样的。,值得注意的是,C+把struct关键字描述的内容当作了一种数据类型,当用struct关键字定义一个结构时,C+不会为这个结构分配内存。 只有当用这种数据类型定义了变量时,C+才会为这个变量分配内存。,结构的成员也可以是另外一个结构变量。如在前面关于学生基本信息的定义,可以用一个结构来定义学生的出生日期,如: struct Date/定义表示日期的结构 int nYear; int nMon; int nDay; ;,struct Stude

4、nt1 intnID;/整型成员 char szName20; /字符型成员 /用结构Date定义的结构变量来表示出生日期 Date dtBirthday; char szAddr100;/字符型成员 char szPhone15;/字符型成员 float fScore;/浮点型成员 ;,使用结构,定义了结构之后,就可以用该结构定义相应的结构变量,C+会为这个结构变量分配内存。例如,前面已经定义了Student结构,现在可以用如下的方式定义结构变量: Stucent s; 现在,C+已经为结构变量s分配了空间,但由于没有初始化s,s的各成员的值是随机的。初始化结构变量s可以有两种方法:,结构变

5、量初始化,一种方法是在定义结构变量的同时进行初始化,如: Student s=1,李明,1989-10-15,解放路号,83647526,93.5; 另一种方法是在定义了结构变量之后,通过访问结构成员的方法给结构成员赋初值。C+提供了点操作符“.”来访问结构成员,可以通过“结构变量名.成员名”的方式来读取结构成员的值或者为结构成员赋值。,/*例17-1 定义和使用结构*/ struct Student intnID; charszName20; charszAddr100; charszPhone15; floatfScore; ; void main() Student s; s.nID =

6、 1; strcpy(s.szName,李明); strcpy(s.szAddr,解放路号); strcpy(s.szPhone,83647526); s.fScore = 93.5; cout学生的学号是:s.nIDendl; cout学生的姓名是:s.szNameendl; cout学生的住址是:s.szAddrendl; cout学生的联系电话是:s.szPhoneendl; cout学生的入学成绩是:s.fScoreendl; ,对于Student1这样的复杂结构,也可以采用上面的两种方法初始化结构变量。如: Student1 s1=1,李明,1984,10,15, “解放路号,836

7、47526,93.5; 或者: Student1 s1;s1.nID = 1; strcpy(s1.szName,李明); s1.dtBirthday.nYear = 1984; s1.dtBirthday.nMon = 10; s1.dtBirthday.nDay = 15; strcpy(s.szAddr,解放路号); strcpy(s.szPhone,83647526); s.fScore = 93.5;,同一个结构定义的结构变量之间是可以相互赋值的。如: student s=1,李明,1984-10-15,解放路号,83647526,93.5; student s2 = s; 结构变量

8、s2的各个成员和结构变量s的各个成员的值一样。输出s2成员的值: cout“学生的学号是:”s2.nIDendl; cout“姓名是:s2.szNameendl; cout“出生日期是:”s2.szBirthdayendl; cout“住址是:s2.szAddrendl; cout“联系电话是:s2.szPhoneendl; cout“入学成绩是:s2.fScoreendl;,结构与指针,当用结构定义结构变量后,C+会为该结构变量分配内存。既然结构变量有地址,自然可以将这个结构变量的地址赋给结构指针,然后通过指针来访问结构成员。 在C+中,用结构指针访问结构成员,需要用到箭头操作符“-”。即采

9、用指针变量-成员名 的方式访问结构成员。下面的例子展示了使用结构指针访问结构成员。,/*例17-2 使用指针访问结构成员*/ struct Student intnID; charszName20; char szBirthday15; charszAddr100; charszPhone15; floatfScore; ; void main() Student s; Student *ps; ps = ,strcpy(ps-szAddr,解放路号); strcpy(ps-szPhone,83647526); ps-fScore = 93.5; coutnIDszNameszBirthday

10、szAddrszPhonefScoreendl; ,注意:使用指针ps访问结构成员时,必须使用需要使用箭头操作符 “-”。 如果要动态创建一个结构变量,也需要使用结构指针,如: Student *ps = new Student; 在这条语句里,使用了new关键字在堆里动态创建了一个结构变量,并通过指针指向这个结构变量,然后可以使用指针变量-成员名的方式访问这个在堆空间里的结构变量的成员,如:,ps-nID = 1; strcpy(ps-szName,李明); 对于动态分配的空间,在使用完后,需要用delete手动释放所分配的空间: delete ps;,结构与数组,前面已经定义了studen

11、t结构,可以描述一个学生的信息。现在描述一个班的学生档案用于学习管理系统开发。 这时,可以用结构数组来描述这个群体。 和C+的基本数据类型一样,结构作为一种数据类型也可以用来定义数组。结构数组的每一个元素都是一个结构类型的数据。,结构数组定义,定义结构数组的一般形式是: 结构名 数组名数组长度 如:Student s5; /定义一个包含5个元素的数组,每个数组元素都是Student型的结构变量。 定义好结构数组后,可以用“.”操作符访问数组每个元素的成员的方法给结构数组赋初值,如: s0.nID = 1; 也可在定义结构数组的同时,给结构数组的每一个元素赋初值,如:,Student s5 =

12、1,李明,1984-10-15, 解放路号,83647526,93.5, 2,张强,1984-07-12,凯旋路号, 83568971,82.0, 3,王雨,1984-09-25,德胜路号, 83836541,96.5, 4,赵新,1984-02-27,和平路号, 83742349,87.5, 5,孙刚,1984-12-16,东大街号, 83536382,89.0;,用结构数组来描述一类数据后,可以用循环等方法方便的对这些数据进行处理。 /*例17-3 结构数组使用举例*/ struct Student intnID; charszName20; char szBirthday15; char

13、szAddr100; charszPhone15; floatfScore; ;,void main() floatfAverage ; float fSum = 0.0; /下面再定义结构数组的同时给每个数组元数赋初值 Student s5 = 1,李明,1984-10-15,解放路号,83647526,93.5, 2,张强,1984-07-12,凯旋路号,83568971,82.0, 3,王雨,1984-09-25,德胜路号,83836541,96.5, 4,赵新,1984-02-27,和平路号,83742349,87.5, 5,孙刚,1984-12-16,东大街号,83536382,89

14、.0 ;,for(int i=0;i5;i+) cout“学生的学号是:”si.nIDendl; cout学生的姓名是:si.szNameendl; cout“出生日期是:”si.szBirthdayendl; cout学生的住址是:si.szAddrendl; cout“联系电话是:”si.szPhoneendl; cout“学生的入学成绩是:”si.fScoreendl; coutendl; fSum += si.fScore; fAverage = fSum / 5; cout所有学生的总成绩是:fSumendl; cout所有学生的平均成绩是:fAverageendl; ,结构与函数,

15、定义一个函数,然后将要打印的结构变量作为参数传递给函数,由函数处理打印事务。将前面的班级学生的基本信息打印显示到屏幕上。 结构可以作为函数的参数,也可以让函数返回一个结构变量。 结构作为函数的参数时,也可以按照值传递、指针传递和引用传递的方式进行参数传递。,/*例17-4 结构作为函数的参数*/ #include #include using namespace std; struct Student intnID; charszName20; char szBirthday15; charszAddr100; charszPhone15; floatfScore; ; void PrintI

16、nfoByValue(Student s); void PrintInfoByPointer(Student *ps); void PrintInfoByRef(Student ,void main() inti; Student s5 = /给s0赋值 1,“李明”,“1984-10-15”,“解放路10号,83647526,93.5, /给s1赋值 2,张强,1984-07-12,凯旋路11号,83568971,82.0, /给s2赋值 3,王雨,1984-09-25,德胜路12号,83836541,96.5, /给s3赋值 4,赵新,1984-02-27“,和平路15号,83742349

17、,87.5, /给s4赋值 5,孙刚,1984-12-16“,东大街16号,83536382,89.0 ;,cout结构变量传值调用endl; for(i=0;i5;i+) PrintInfoByValue (si); cout结构变量指针传递调用endl; for(i=0;i5;i+) PrintInfoByPointer( ,void PrintInfoByValue(Student s) cout学生的学号是:s.nIDendl; cout学生的姓名是:s.szNameendl; cout“学生的出生日期是:”s.szBirthdayendl; cout学生的住址是:s.szAddren

18、dl; cout学生的联系电话是:s.szPhoneendl; cout学生的入学成绩是:s.fScoreendl; coutendl; ,void PrintInfoByPointer(Student *ps) /指针传递参数 coutnIDszNameszBirthdayszAddrszPhonefScoreendl; coutendl; ,void PrintInfoByRef(Student ,思考:修改以上程序,求出成绩最高分。,/*例17-5 函数返回结构,求最大值*/ #include #include using namespace std; struct Student intnID; charszName20; char szBirthday15; charszAddr100; charszPhone15; floatfScore; ;,voidPrintInfoByPointer(Student *ps); Student G

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论