已阅读5页,还剩61页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象程序设计 讲义 第7章 7 1C 类的构成关键字 class例如 classpoint intx y public voidsetpoint int int 第7章类的定义及其类对象的封装性 7 1 1私有成员和公有成员1 私有成员a 关键字 private 有时可省略 b 访问权限 只限于通过成员函数来访问 也就是说只有类本身能够访问它 任何类以外的函数对私有数据的访问都是非法的 2 公有成员a 关键字 public 不能省略 b 访问权限 允许类的使用者来访问它 7 1 2类的构造 7 2成员函数的定义例如 前面定义的point类 其成员函数的定义为 voidpoint setpoint intvx intvy 定义成员函数时的注意事项 1 在所定义的成员函数之前应缀上类名 在类名和函数之间加上分隔符 2 函数的返回类型一定要与函数声明的类型相匹配 3 在定义成员函数时 应同时给出参量类型和参量名 内置函数的定义方式 1 隐式定义 2 显式定义 最前面加关键字 inline 7 3类与对象7 3 1类与对象的关系类与对象的关系 整型int和整型变量i的关系创建对象的两种方法 1 在定义类的同时创建对象例如 classdata tt 2 在使用时定义对象 常用 datatt 7 3 2类的使用例如 classpoint intx y public voidsetpoint intvx intvy x vx y vy voidf1 pointp1 p1 setpoint 10 10 voidf2 pointp1 point p2 p2 p2 setpoint 10 10 7 3 3名字解析classrealset 定义一个实数集合类intcard floatelems 16 public voidprint classintset 定义一个整数集合类intcard intelems 16 public voidprint voidf intsetis realsetrs is print 调用的是intset中的print 函数rs print 调用的是realset中的print 函数 7 4构造函数与析构函数构造函数和析构函数的特点 1 它们都没有返回值 定义时不需指出类型 2 它们不能被继承 3 构造函数可以有缺省参数 4 析构函数可以是虚的 virtual 但构造函数不行 5 不可取它们的地址 6 不能用常规调用方法调用构造函数 当使用完全限定名 带对象名 类名和函数名 时可以调用析构函数 7 当定义对象时 编译程序自动调用构造函数 当删除对象时 编译程序自动地调用析构函数 7 4 1构造函数定义构造函数应注意的问题 1 构造函数的名字必须与类名相同 2 构造函数没有返回值 在声明和定义时不能说明它的类型 3 构造函数的功能是对对象进行初始化 初始化的构造函数数据成员一般均为私有成员 构造函数举例 includeclassqueue 定义定义一个整型队列类intq 100 用数组q来存放队列中的各个元素intsloc rloc sloc表示队列尾 rloc表示对列头public queue 声明构造函数voidqput inti 往队列中增加元素的函数intqget 从队列中提取元素的函数 queue queue sloc rloc 0 给队列类的两个私有变量赋初值cout queueinitialized n 在屏幕上输出对象已 初始化的信息 voidqueue qput inti if sloc 100 若sloc为100 表明队列已满 cout queueisfull n return sloc q sloc i 在队列尾后追加队列元素i intqueue qget if rloc sloc 若队列头和队列尾相交 队列中无元素 cout queueisempty n return0 rloc 将队列头标识后移 取出第一个元素returnq rloc main queuea b 定义queue的两个对象a和ba qput 10 往两个队列对象中追加元素 b qput 20 a qput 20 b qput 19 cout a qgrt 将两个队列对象中的元素取出 显示在屏幕上cout a qgrt n cout b qgrt cout b qgrt n return1 程序运行结果为 queueinitializedqueueinitialized10202019 7 4 2参数化的构造函数例如 classpoint intx y public point intvx intvy 声明带参量的构造函数voidoffset intax intay point point intvx intvy x vx 用传递进来的参数对私有量赋x y初值y vy voidpoint offset intax intay x x ax 对私有变量增值y y ay main pointpt1 10 20 定义对象 并给构造函数传递参数pt1 offset 10 10 7 4 3缺省参数的构造函数例如 classpoint intx y public point intvx 0 intvy 0 x vx y vy main pointp1 不传递参数 全部用缺省值pointp2 10 只传递一个参数pointo3 10 20 传递两个参数 在函数所带的参数中 若有一部分缺省 则所有取缺省的参数必须出现在不取缺省值的参数的右边 例如 1 point intx inty 0 正确 2 point intx 0 inty 错误7 4 4多构造函数例如 classx public x x int x int char x float char 注意事项 在使用缺省参数的构造函数时 要避免二义性 例如 classx public x x inti 0 main xone 10 xtwo 7 4 5拷贝构造函数特殊功能 将参数代表的对象逐域拷贝到新创建的对象中 拷贝构造函数的两种定义形式 1 系统产生 2 用户定义格式 x x constx x为类名 参数类型为x 例如 classpoint intx y public point intvx intvy x vx y vy point constpoint 7 4 6动态存储new的优点 1 new自动计算要分配的类型的大小 2 能自动返回正确的指针类型 不必对返回指针进行类型转换 3 可以用new将分配的对象初始化 1 new和delete的语法 1 new的语法格式 名字指针 new名字 名字初始化值 例如 int s s newint 200 用new分配数组 int p newint 10 int q newint 2 3 5 正确int q newint 3 5 错误 2 delete的语法格式 delete名字指针 ints newint 200 deletes 2 new和delete的使用例1动态分配和释放存储区 includemain int p newint if p cout allocationfailure n return0 p 20 cout p deletep return1 例2动态分配并初始化存储区 includemain int p newint 99 if p cout allocationfailure n return0 cout p deletep return1 例3动态分配数组 includemain double s newdouble 10 inti if s cout allocationfailure n return0 for i 0 i 10 i s i 100 00 i for i 0 i 10 i cout s i delete s return1 例4为结构类型的变量动态分配存储 includestructperson char name intage main person p p newperson if p coutname newchar 20 p name Smart p age 23 coutnameage deletep return1 例5为对象动态分配存储 includeclasspoint intx y public point intvx 0 intvy 0 x vx y vy voidprint cout x y n main point p1 p1 newpoint 10 20 if p coutprint deletep1 return1 例6为对象数组动态分配存储区 includeclasspoint intx y public point intvx 16 intvy 16 x vx y vy voidprint cout x y n main point p1 定义一个指向point类对象的指针p1 newpoint 10 为point类对象数组分配存储 if p1 并将头指针返回给p1 cout allocationfailure n return0 for inti 0 i 10 i 访问对象数组中每一个对象p1 i print 调用对象的成员函数delete p1 释放对象数组所占的存储return1 对象数组初始化的两种方法 1 在所定义的类中不定义构造函数 而定义一个成员函数专门用来完成初始化功能 对象数组被创建以后 可以通过调用此成员函数来对对象数组中的元素进行初始化 2 在所定义的类中增加不带参数的构造函数或带缺省参数的构造函数 7 4 7析构函数1 析构函数的定义 析构函数名字与类名相同 在前面加长一个符号 2 举例 includeclassstring intlength char contents public string char s string string string char s 定义构造函数 if s length strlen s contents newchar length 1 为字符串分配存储strcpy contents s 字符串之间赋值 else length 0 contents 0 string string 定义析构函数 deletecontents 释放字符串contents所占存储 创建字符串对象 strings1 7 5静态成员7 5 1静态数据成员1 关键字 static2 初始化 静态数据的初始化是在类外进行的 类型类名 静态数据成员 初值 3 举例 include includeclasscounter 定义一个counter类staticintcount 静态数据定义 表示共创建的对象数intobjnumber 用来表示对象号public 定义构造函数counter count 每创建一个对象 对象数加1objnumber count 给当前对象号赋值 voidshow cout obj objnumber cout count count n intcounter count 0 给静态数据初始化main counterobj1 创建第一个对象obj1obj1 show 显示对象号和当前对象数cout n counterobj2 创建第二个对象obj2obj1 show 显示当前存在的二个对象obj2 show 的数据成员cout n counterobj3 创建第三个对象obj3obj1 show obj2 show obj3 show cout n counterobj4 创建第四个对象obj4obj1 show obj2 show obj3 show obj4 show cout n 运行结果 obj1count 1 obj1count 2obj2count 2 obj1count 3obj2count 3obj3count 3 obj1count 4obj2count 4obj3count 4obj4count 4 obj1count 4obj2count 4obj3count 4obj4count 4 7 5 2静态成员函数1 关键字 static2 注意事项 1 使用时要指出它作用在哪个对象上 或用 类名 作限定词 2 不能随意地访问对象中的非静态的数据成员 举例说明如下 include includeclassstring 定义一个字符串类staticinttotal length 定义一个静态变量 用来存 放所有字符串的总长度intlength 定义存放此字符串长度变量char contents 定义变量 用来存放字符串内容public string char s 定义构造函数length strlen s 取字符串的长度 contents newchar length 1 为字符串分配存储strcpy contents s 字符串拷贝staticintset total length 总长度函数total length total length length 该语句有问题 returntotal length string 析构函数 delete contents 定义变量 用来存放字符串内容 intstring total length 0 给静态变量赋初值main stringobj1 TheFirstObject cout obj1 set total length n 算总长度 并输出结果stringobj2 TheFirstObject cout obj1 set total length n 算总长度 并输出结果return1 静态成员函数改为 staticintset total length stringobj total length total length obj length returntotal length main stringobj1 TheFirstObject cout obj1 set total length obj1 n 算总长度 并输出stringobj2 TheFirstObject cout obj1 set total length obj2 n 算总长度 并输出return1 3 this指针当一个对象接收到一个消息时 系统会自动地向它传递一个隐含的 指针 参数 该指针称为 this 指针 举例说明如下 classLinear List int List 指向表头的指针unsignednMax 表的最大长度unsignednElem 表中实际元素个数public voidinit intn 10 List newint n nMax n nElem 0 intElem int 将元素置入表尾 成功返回非零值 intLinear List Elem intelem if nElem nMax List nElem elem returnnElem return0 表已满 返回零 voidmain Linear Listlist list init 20 for inti 1 inElemnMax this List this Elem elem returnthis nElem return0 表已满 返回零 this指针有如下的缺省说明 Linear List constthis 当程序执行语句 list Elem i 时 系统对this进行了如下的缺省赋值 this this指针的特殊用途 为了将一个线性表赋给另一个线性表 可以为类增加一个赋值成员函数 voidAssign Linear List 7 6类对象作为数据成员注意事项 类的内部对象如何初始化例1 includeclassinner class intx public inner class intz 定义构造函数 x z voidwrite print d n x classouter class inty inner classx x r为成员对象inner classr public outer class intz 声明构造函数voidwrite print d n y voidwrite inner x 由成员对象x调用 x inner class write 调用inner class中voidwrite inner r 成员函数write r inner class write outer class outer class intz x 20 r 36 定义outer class类的构造函数 y z main outer classobj 10 obj write inner x 显示对象成员x中的私有成员obj write inner r 显示对象成员r中的私有成员obj write 显示对象obj的私有成员 7 7对象数组注意事项 因为在定义对象数组时不能不给构造函数传递参数 所以在类中必须有一个不带参数的构造函数或带缺省参数的构造函数 举例如下
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉林艺术学院《素描Ⅰ》2021-2022学年第一学期期末试卷
- 吉林艺术学院《电影剧作构成》2021-2022学年期末试卷
- 2024年公寓租赁消防合同范本
- 2024年大型园林转让合同范本
- 2024年大批油罐车转让协议书模板
- 2022年公务员多省联考《申论》真题(黑龙江省市卷)及答案解析
- 2022年内蒙古省公务员录用考试《行测》真题及答案解析
- 2022年公务员多省联考《申论》真题(宁夏C卷)及答案解析
- 吉林师范大学《世界现代史》2021-2022学年第一学期期末试卷
- 吉林师范大学《国画技法训练》2021-2022学年第一学期期末试卷
- 装配式建筑精装施工方案
- 2022-2023学年福建省福州市福清市闽教版五年级上学期期中练习英语试卷(含听力音频)
- 经营范围登记规范表述目录(试行)(V1.0.2版)
- 生活区消防自查记录表
- 2024届广东省深圳市宝安区宝安中学物理九上期中质量跟踪监视模拟试题含解析
- 制图员(五级)技能理论考试复习题库(含答案)
- 化粪池吸污施工方案
- 小儿童中耳炎
- 创新方法大赛理论测试题库(2018、2019、经典题库)
- 湖北省武汉一初慧泉2023-2024+学年上学期9月同步练习Unit1-Unit+3九年级英语试卷
- 《中华商业文化》第五章
评论
0/150
提交评论