




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章类和对象 本章主要介绍 类和对象的基本概念构造函数与析构函数对象数组 对象指针及引用string类向函数传递对象对象的赋值和复制静态成员友元类的组合常量对象及常量成员 我们用计算机解决实际问题时 这些问题无非由一些相互间存在一定联系的事物组成 把这些事物称作对象 每个具体的对象都可以用下述两个特征来表示 描述事物状态属性所需要使用的数据结构 以及对这些数据进行的有限操作 表示事物的动态行为 把数据结构和对数据的操作放在一起构成一个整体 才能完整地反映实际问题 3 1 1结构和类用C语言和其它传统的语言所编写的程序必然包含一组数据结构以及用来处理这些数据结构的模块 由于这些语言没有提供数据抽象的功能 程序和数据结构是分离的 这就存在使用错误的数据调用正确的程序模块 或使用正确的数据调用错误的程序模块 使数据和程序保持一致性是程序员的一个沉重负担 3 1类和对象的基本概念 1 回顾 C语言的结构体例3 0 已知复数的实部 虚部 分别输出复数的实部 虚部及绝对值 3 1类和对象的基本概念 结构体定义 include includestructcomplex doublereal doubleimag 处理结构体的函数complexinit doubler doublei complexu u real r u imag i returnu doubleabscomplex complexu doublet t sqrt u real u real u imag u imag returnt 主函数定义voidmain complexA A init 3 0 4 0 cout realofcomplexA cout A real endl cout imagofcomplexA cout A imag endl cout absofcomplexA cout abscomplex A endl 程序运行输出结果 realofcomplexA 3imagofcomplexA 4absofcomplexA 5 3 1类和对象的基本概念 C语言结构体总结 只有数据成员成员可以被外部随便使用complexinit 和doubleabscomplex 都是专门处理结构体的函数 但在结构上和结构体没有任何关系既然是专门处理结构体的函数何不包含在结构体内 3 1类和对象的基本概念 2 C 对C语言的结构体进行了扩充 在C 中 在定义一个结构时 可以定义成员函数 例3 1 已知复数的实部 虚部 分别输出复数的实部 虚部及绝对值 初步熟悉成员函数 3 1类和对象的基本概念 结构体定义 include includestructcomplex doublereal doubleimag voidinit doubler doublei real r imag i doublerealcomplex returnreal doubleimagcomplex returnimag doubleabscomplex doublet t sqrt real real imag imag returnt 主函数定义voidmain complexA A init 3 0 4 0 cout realofcomplexA cout A realcomplex endl cout imagofcomplexA cout A imagcomplex endl cout absofcomplexA cout A abscomplex endl 程序运行输出结果 realofcomplexA 3imagofcomplexA 4absofcomplexA 5 3 1类和对象的基本概念 C 结构体的扩充总结 在C 中 扩充了成员函数 如程序中的init realcomplex imagcomplex abscomplex 等 在C 的结构中 成员分公有成员 public 和私有成员 private 私有成员只能在结构内使用 公有成员既可以在结构内使用 亦可在其它地方使用 在结构中 未指明为公有成员或私有成员的成员默认为公有成员 成员函数的调用方法 结构变量 成员函数 实参表 3 1类和对象的基本概念 3 C 对结构的扩充 类C 提供了一种比结构体更为安全的数据类型 类 类与结构的扩充形式非常相似 但凡是未定义为公有成员 public 或保护成员 protected 的成员均为私有成员 private 封装性的体现 例3 2 将例3 1用类定义 3 1类和对象的基本概念 include includeclasscomplex private doublereal doubleimag public voidinit doubler doublei real r imag i doublerealcomplex returnreal doubleimagcomplex returnimag doubleabscomplex doublet t sqrt real real imag imag returnt 3 1类和对象的基本概念 voidmain complexA A init 3 0 4 0 cout realofcomplexA cout A realcomplex endl cout imagofcomplexA cout A imagcomplex endl cout absofcomplexA cout A abscomplex endl class类名 private protected public 4 类的定义形式 3 1类和对象的基本概念 说明public private和protected关键字被称为访问权限修饰符或访问控制修饰符 它们在类定义中出现的前后顺序及出现的次序没有限制 如果一个成员函数在类定义中进行了定义 实现部分将不出现 如果所有的成员函数在类中进行了定义 则没有实现部分 3 1类和对象的基本概念 例3 3定义一个日期类 其要求为 设置年 月 日的具体值 判断该年是否为闰年 显示年 月 日1 分析类名 抽象数据类型 Date数据成员 用整型数year month day表示年 月 日 成员函数 对Date的操作 setdate 设置日期isleapyear 判断是否为闰年printdate 显示日期 3 1类和对象的基本概念 2 类的定义 includeclassDate private intyear month day public setdate inty 2000 intm 1 intd 1 year y month m day d intisleapyear void voidprintdate void cout year month day endl intDate isleapyear void intp p year 4 0 3 1类和对象的基本概念 3 类的使用 主函数 voidmain void Dateda1 da2 da1 setdate 2004 5 1 da2 setdate 2006 10 1 da1 printdate da2 printdate cout 2004year if da1 isleapyear cout isaleapyear endl elsecout isnotaleapyear endl cout 2006year if da2 isleapyear cout isaleapyear endl elsecout isnotaleapyear endl 3 1类和对象的基本概念 3 1 2 数据成员1 一般定义格式 类型数据成员名2 说明数据成员中 不能使用auto register extern等进行说明 请思考为什么 定义类时 计算机并不给数据成员分配内存空间 在定义对象时才分配空间 不能在定义时给类中的成员赋初值 请思考为什么 数据成员既可为基本数据类型 也可以是复杂数据类型 数组 指针 引用 结构体 也可以是类对象等 数据成员通常定义为私有成员 以实现数据的隐藏 3 1类和对象的基本概念 3 1 3 函数成员成员函数通常设为公有的 以通过消息传递访问数据成员 保护成员主要用于继承 成员函数的声明通常采用以下两种方式 将成员函数以普通函数的形式在类外定义一般形式是 返回类型类名 成员函数名 参数表 函数体 例如 以下是表示坐标点的类Coord的声明 3 1类和对象的基本概念 classCoord private intx y public voidsetCoord int int 设置坐标点intgetx 取x坐标点intgety 取y坐标点 voidCoord setCoord inta intb x a y b intCoord getx returnx intCoord gety returny 3 1类和对象的基本概念 将成员函数以内联函数的形式进行说明 在C 中 可以用下面两种格式将成员函数声明为类的内联函数 在类中定义的成员函数在类外定义 但在函数头前加上了inline关键字 3 1类和对象的基本概念 隐式声明直接将函数声明在类内部 classCoord private intx y public voidsetCoord inta intb x a y b intgetx returnx intgety retruny 3 1类和对象的基本概念 将成员函数以内联函数的形式进行说明 在C 中 可以用下面两种格式将成员函数声明为类的内联函数 显式声明这种成员函数在类外定义的一般形式是 inline返回类型类名 成员函数名 参数表 函数体 3 1类和对象的基本概念 例如上面的例子改为显式声明可变成如下形式 classCoord public voidsetCoord int int intgetx intgety private intx y inlinevoidCoord setCoord inta intb x a y b inlineintCoord getx returnx inlineintCoord gety returny 3 1类和对象的基本概念 1 类与对象的关系通常我们把具有共同属性和行为的事物所构成的集合叫做类 在C 中 可以把相同数据结构和相同操作集的对象看成属于同一类 类的变量叫做类的对象 也叫类的实例 3 1 4对象的定义和使用 3 1类和对象的基本概念 2 对象的定义在声明类的同时 直接定义对象即在声明类的右花括号 后 直接写出属于该类的对象名表 例如 classCoord public voidsetCoord int int intgetx intgety private intx y op1 op2 3 1类和对象的基本概念 声明了类之后 在使用时再定义对象定义的格式与一般变量的定义格式相同 例如 classCoord main Coordop1 op2 2 对象的定义 3 1类和对象的基本概念 3 对象中成员的访问在类的外部通过类的对象进行访问访问的一般形式是 对象名 数据成员名或对象名 成员函数名 参数表 或对象名 类名 成员函数名 参数表 其中 叫做对象选择符 简称点运算符 也叫成员引用运算符 3 1类和对象的基本概念 例3 2使用类Coord的完整程序 includeclassCoord public voidsetCoord inta intb x a y b intgetx returnx intgety returny private intx y voidmain Coordop1 inti j op1 setCoord 5 6 调用op1的setCoord 初始化对象op1i op1 getx 调用op1的getx 取op1的x值j op1 gety 调用op1的gety 取op1的y值cout op1i i op1j j endl 3 1类和对象的基本概念 4 类成员的访问属性类成员有三种访问属性公有 public 私有 private 和保护 protected 公有成员不但可以被类中成员函数访问 还可在类的外部 通过类的对象进行访问 私有成员只能被类中成员函数访问 不能在类的外部 通过类的对象进行访问 保护的成员除了类本身的成员函数可以访问外 该类的派生类的成员也可以访问 但不能在类的外部 通过类的对象进行访问 3 1类和对象的基本概念 6 类的作用域和成员的访问属性指在类声明中的一对花括号所形成的作用域 一个类的所有成员都在该类的作用域内 一个类的任何成员可以访问该类的其他成员 而在类的外部 对该类的数据成员和成员函数的访问则要受到一定的限制 有时甚至是不允许的 这体现了类的封装特性 例3 6理解类的作用域 3 1类和对象的基本概念 includeclassmyclass public inti voidinit int voidshow cout i i endl 可以访问类中的数据成员i voidmyclass init intsi i si 可以访问类中的数据成员iintfun returni 非法 不能直接访问类中的ivoidmain myclassob ob init 5 给数据成员i赋初值5ob show i 8 非法 不能直接访问类中的i 可改写成ob i 8ob show 3 1类和对象的基本概念 3 2构造函数与析构函数 构造函数和析构函数都是类的成员函数 但它们都是特殊的成员函数 执行特殊的功能 不用调用便自动执行 而且这些函数的名字与类的名字有关 3 2 1构造函数是一种特殊的成员函数 主要用于为对象分配空间和初始化 具有一些特殊的性质函数名必须与类名相同 可以有任意类型的参数 但不能指定返回类型 它有隐含的返回值 该值由系统内部使用 是特殊的成员函数 函数体可写在类体内 也可写在类体外 可重载 即一个类中可以定义多个参数个数或参数类型不同的构造函数 被声明为公有函数 但它不能象其他成员函数那样被显式地调用 它是在创建对象的同时被调用的 例3 7为类Date建立一个构造函数 includeclassDate public Date inty intm intd 构造函数voidsetDate inty intm intd voidshowDate private intyear month day Date Date inty intm intd 构造函数的实现 year y month m day d voidDate setDate inty intm intd year y month m day d inlinevoidDate showDate cout year month day endl 3 2构造函数与析构函数 类名 参数表 类名 类名 参数表 函数体 3 2构造函数与析构函数 通常 利用构造函数创建对象有以下二种方法 利用构造函数直接创建对象其一般形式为 类名对象名 实参表 这里的 类名 与构造函数名相同 实参表 是为构造函数提供的实际参数 例3 8利用构造函数直接创建对象 includeclassDate 省略 同例3 7 省略 同例3 7 voidmain Datedate1 2007 4 9 cout Date1output1 endl date1 showDate date1 SetDate 2007 7 14 cout Date1output2 endl date1 showDate 3 2构造函数与析构函数 定义类Date的对象date1 自动调用date1的构造函数 初始化对象date1 调用date1的showDate 显示date1的数据 调用date1的setDate 重新设置date1的数据 调用date1的showDate 显示date1的数据 3 2构造函数与析构函数 利用构造函数创建对象时 通过指针和new来实现 其一般语法形式为 类名 指针变量 new类名 实参表 例如 Date date1 newDate 2007 4 9 就创建了对象 date1 将例3 8的主函数改成用这种方法来实现 其运行结果与原例题完全相同 通常 利用构造函数创建对象有以下二种方法 类名 voidmain Date date1 date1 newDate 2007 4 9 上两条语句可合写成 Date date1 newDate 2007 4 9 coutshowDate date1 setDate 2007 11 14 coutshowDate deletedate1 3 2构造函数与析构函数 成员引用运算符 3 2构造函数与析构函数 3 2 2成员初始化表带有成员初始化表的构造函数的一般形式如下 类名 构造函数名 参数表 成员初始化表 构造函数体 成员初始化表的一般形式为 数据成员名1 初始值1 数据成员名2 初始值2 例3 9成员初始化表的使用 includeclassA public A intx1 x x1 rx x pi 3 14 rx x 相当于rx x pi 3 14 相当于pi 3 14voidprint cout x x rx rx pi pi private intx int 3 2构造函数与析构函数 3 2构造函数与析构函数 3 2 2成员初始化表成员初始化表也可以写在函数体内类名 构造函数名 参数表表 构造函数体 含初始化语句 例3 9的构造函数可写成如下形式 A intx1 x x1 rx x pi 3 14 3 2构造函数与析构函数 3 2 3带缺省参数的构造函数例3 11 includeclassCoord intx y public Coord inta 0 intb 0 x a y b 带有缺省参数的构造函数intgetx returnx intgety returny voidmain Coordop1 5 6 Coordop2 5 Coordop3 inti j i op1 getx j op1 gety cout op1i i op1j j endl i op2 getx j op2 gety cout op2i i op2j j endl i op3 getx j op3 gety cout op3i i op3j j endl 3 2构造函数与析构函数 3 2 4析构函数它也是一种特殊的成员函数 执行与构造函数相反的操作 通常用于撤消对象时的一些清理任务 如释放分配给对象的内存空间等 具有一些特殊的性质 与构造函数名字相同 但前面必须加一个波浪号 没有参数 也没有返回值 而且不能重载 因此在一个类中只能有一个析构函数 当撤消对象时 编译系统会自动地调用析构函数 例3 12重新说明类Date 3 2 4析构函数 includeclassDate intyear month day public Date inty intm intd 构造函数 Date 析构函数voidsetDate inty intm intd voidshowDate Date Date inty intm intd 构造函数的实现 cout constructing endl year y month m day d Date Date 析构函数的实现 cout destruting endl 3 2构造函数与析构函数 类名 类名 类名 voidDate setDate inty intm intd year y month m day d inlinevoidDate showDate cout year month day endl voidmain
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年驾照三力测试试题题库及答案
- 阿里地区2024-2025学年七年级上学期语文期中模拟试卷
- 安徽省2024年高二学业水平合格性考试物理考试题目及答案
- 2025 年小升初太原市初一新生分班考试英语试卷(带答案解析)-(人教版)
- 2025 年小升初承德市初一新生分班考试数学试卷(带答案解析)-(人教版)
- 天津2025年上半年造价工程师考试造价管理:工程项目目标控制的内容试题
- 社区老年食品安全知识培训课件
- 北师大版四年级上册数学第七-八单元 生活中的负数、数学好玩 可能性检测题 (无答案)
- 代销服装协议合同范本
- 法院卫生保洁合同范本
- 广州市国家级青少年足球训练基地项目可行性研究报告
- 机械租赁避税方案(3篇)
- 氧化蜡行业深度研究分析报告(2024-2030版)
- 2025-2030年中国动力耳鼻喉科手术器械行业市场现状供需分析及投资评估规划分析研究报告
- 2025至2030中国建筑防腐行业发展趋势与前景分析报告
- 2025年重庆市中考化学试卷真题(含标准答案)
- 社会化服务项目方案投标文件技术方案
- 电石中控岗位操作规程
- 造型基础-全套教案课件
- 幕墙密封胶相容性检测
- 如何清洁头皮可促进头发生长
评论
0/150
提交评论