已阅读5页,还剩73页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章类和对象 二 对象指针和对象引用对象数组和对象指针数组常类型子对象和堆对象类型转换 6 1对象指针和对象引用 指向类的成员的指针对象指针和对象引用作函数参数 6 1 1指向类的成员的指针 C 中可以说明指向类的数据成员和成员函数的指针 指向数据成员的指针格式为 指向成员函数的指针格式为 6 1 1指向类的成员的指针 classA public intfun intb returna c b A intI a I intc private inta intA pc error类A中的a是私有成员 指针pa是无权访问的 6 1 1指向类的成员的指针 定义好指向类成员的指针后 在使用之前 同样需要先确定对象 再通过指针来指向对象中的成员 如 Aa a pc 8 注 运算符 是用来对指向类成员的指针来操作该类的对象的 6 1 1指向类的成员的指针 如果使用指向对象的指针来对指向类成员的指针进行操作时 使用运算符 A p includeclassA public A inti a i intfun intb returna c b intc private inta voidmain Ax 8 intA pc pc 输出 29 该程序中定义了两个指向类的成员的指针 pc和pfun 其中 pc是指向类A中数据成员c的指针 pfun是指向类A中成员函数的指针 并且给这两个指针赋了值 程序中对指向类的成员的两个指针进行引用和调用 其中 x pc 3 这是给对象x的成员c赋值 它是一个公有成员 等价于x c 3 而 p pfun 5 这是通过指向对象的指针p来调用指向类的成员函数的指针pfun 该函数的实参是5 它等价于p fun 5 也可以使用对象来调用指向类的成员函数的指针所指向的成员函数 例如 x pfun 5 该程序中出现了两种指针 一种是指向对象的指针 A p 另一种是指向类的成员的指针 6 1 2对象指针和对象引用作函数参数 1 对象指针作函数参数其优点有 一 作为传址调用 实现函数间信息传递二 提高运行效率 减少时空开销 显然 对象指针为形参时 对应实参应为对象的地址值 includeclassM public M inta A a B a staticvoidf1 Mm private intA staticintB voidM f1 Mm cout A m A endl cout B B endl intM B 0 voidmain MP 5 Q 10 M f1 P M f1 Q 公有静态成员函数 私有静态数据成员B 静态成员函数体 通过对象引用非静态成员 直接引用静态成员 私有静态数据成员初始化 调用静态成员函数 A 5B 15A 10B 15 includeclassM public M x y 0 M inti intj x i y j voidcopy M m voidsetxy inti intj x i y j voidprint coutx y m y voidfun Mm1 M m2 voidmain Mp 5 7 q q copy 输出 5 722 25 形参为对象指针 以p对象的地址值为实参 第二个形参为对象指针 1 对象指针作函数参数 57 2225 1215 2 对象引用作函数参数 显然 对象引用为形参时 对应实参应为对象名 includeclassM public M x y 0 M inti intj x i y j voidcopy M 形参为对象引用 第一个形参为对象形参 第二个形参为对象引用 以p对象名为实参 以q对象名为实参 2 对象引用作函数参数 57 2225 1215 例题1 已知p是一个指向类Sample数据成员m的指针 s是类Sample的一个对象 如果要给m赋值为5 正确的是 A s p 5 B s 5 C s p 5 D s p 5 答案 C 类数据成员指针给数据成员赋值的语句为 类名 指针名 值 例题2 已知一个类Sample 假设类有三个公有成员 voidf1 int voidf2 int 和inta 定义指向类Sample成员函数的指针为 A Sample p B intSample pc Sample a C void Sample pa int D Sample a 10 答案 C 例题3 已知f1 int 是类A的公有成员函数 p是指向成员函数f1的指针 采用赋值 正确的是 A p f1 B p A f1 C p A f1 D p f1 答案 B 例题4 已知类Sample中一个成员函数说明如下 voidSet Sample a 其中 Sample a的含义是 A 指向类Sample的指针为aB 将a的地址值赋给变量SetC a是Sample的对象引用 用来作函数Set 的形参D 变量Sample与a按位相与作为函数Set 的参数 答案 C 6 1 3This指针 在C 中 每个当前对象都隐含有一个指向该对象的指针 即this指针 This是一个隐含于每一个类的非静态成员函数中的特殊指针 用于指向正在操作该成员函数的对象 This指针的类型就是成员函数所属的类的类型 includeclassSample intn public Sample Sample intm n m voidaddvalue intm Samples s n n m this s voiddisp cout n n endl voidmain Samples 10 s disp s addvalue 5 s disp 可改为 voidaddvalue intm this n n m 不用this时可改为 voidaddvalue intm n n m 运行结果 n 10n 15 addvalue voidaddvalue Sample this intm 注意 this指针只能在类的成员函数中使用 它指向该成员函数被调用的对象 this指针一般用于返回当前对象自身 静态成员函数没有this指针 在静态成员函数中使用this指针会引起编译错误 This指针 includeclassA public A a b 0 A inti intj a i b j voidcopy A 相当于 voidcopy A this A 若aa引用的是a1 则不赋值 将aa引用的对象值赋给a1 输出 3 4 This指针 注意 此时 操作copy成员函数的对象为a1 因此 this指针指向a1 当某个对象调用成员函数时 编译程序先将对象的地址赋给this指针 然后调用成员函数 每次成员函数存取数据成员时 则隐含使用this指针 如 voidA print coutab endl 6 2对象数组和对象指针数组 6 2 1对象数组6 2 2指向数组的指针和指针数组 6 2 1对象数组 是指数组元素为对象的数组 其定义 赋值和引用与普通数组相同 1 对象数组的定义格式为 如 DATEa1 5 共5个DATE对象空间DATEa2 3 5 共15个DATE对象空间 2 对象数组的赋值 对象数组可以赋初值 也可被赋值 如 classDATE public DATE intm intd inty month m day d year y voidPrint private intmonth day year DATEa1 4 DATE 7 22 1998 DATE 7 23 1998 DATE 7 24 1998 DATE 7 25 1998 或 a 0 DATE 7 22 1998 a 1 DATE 7 23 1998 a 1 DATE 7 24 1998 a 3 DATE 7 25 1998 includeclassDATE public DATE month day year 0 cout 默认构造函数 endl DATE intm intd inty month m day d year y cout 构造函数 endl DATE cout 释放 endl voidPrint private intmonth day year voidDATE Print cout Month month Day day year year endl voidmain DATEdates 5 DATE 7 22 2005 DATE 7 30 2004 DATE 4 22 1998 DATE 5 25 1990 DATE 3 22 2006 for inti 0 i 5 i dates i Print 常用的还是要配合for语句实现 运行结果 includeclassDATE public DATE month day year 0 cout 默认构造函数 endl DATE intm intd inty month m day d year y cout 构造函数 endl DATE cout 释放 endl voidPrint private intmonth day year voidDATE Print cout Month month Day day year year endl voidmain DATEdates 5 DATE 7 22 2005 DATE 7 30 2004 DATE 4 22 1998 dates 3 DATE 5 25 1990 dates 4 DATE 3 22 2006 for inti 0 i 5 i dates i Print 运行结果 对象数组 例题 下列定义中 Sample是一个类 哪个是定义指向对象数组的指针p A Sample p 5 B Sample 5 C Sample 5 D Sample p 答案 B 6 2 2指向数组的指针和指针数组 1 指向数组的指针格式为 如 int p 5 p指向一个共5个整型空间的一维数组DATE pl 3 p1指向一个共3个DATE对象空间的一维数组 1 指向数组的指针 includeinta 3 1 2 3 4 5 6 7 8 9 voidmain int pa 3 a for inti 0 i 3 i cout n for intj 0 j 3 j cout pa i j cout n 运行结果 2 指针数组 指针数组是指数组元素为指针的数组 格式为 如 int p 5 p为一个共5个整型指针空间的一维数组DATE pl 3 p1为一个共3个指向DATE对象空间的指针元素的一维数组 2 指针数组 includeclassA public A inti 0 intj 0 a i b j voidprint coutprint 运行结果 5 70 07 8 6 3常类型 一般常量和对象常量常指针和常引用常成员函数常数据成员 常类型 常类型 使用类型修饰符const说明的类型 常类型的变量或对象的值是不能被更新的 定义或说明常类型时必须初始化 6 3 1一般常量 简单类型的常量 const或const intconstx 2 或constintx 2 intconsta 3 1 2 3 或constinta 3 1 2 3 数组元素的值是常量 不能更新 6 3 1常对象 const classA public A inti intj x i y j private intx y constAa1 3 4 Aconsta2 8 9 a1 a2都是常对象 不能被更新 但可以使用 6 3 2常指针 按const的位置 char constptr1 strptr1 ptr1是一个常量指针 ptr1 strptr2 ptr1 m ptr1不可以更新ptr1所指向的变量可以更新 constchar ptr2 strptr1 ptr2是一个指向字符串常量的指针 ptr2 strptr2 ptr2 m ptr2可以更新ptr2所指向的字符串不可以更新 错误 错误 正确 正确 6 3 2常引用 常引用所引用的对象不能被更新 const doublex 1 2 constdouble则 v 12 3错误 6 3 2常指针与常引用的作用 常指针和常引用常用来作函数的形参 这种参数称为常参数 用来表明该函数不会更新某个参数所指向或所引用的对象 这样 在参数传递过程中就不必执行拷贝初始化构造函数 这将改善程序的运行效率 includeconstintN 6 符号常量voidprint constint p intn 常指针作函数参数voidmain intarray N for intI 0 I array I print array N 数组名为实参 voidprint constint p intn cout p for intI 1 I n I cout p I cout endl array数组为一般数组 能被更新 p所指向的数组为常量数组 不能被更新 输入 123456输出 1 2 3 4 5 6 类型适应 一种类型的变量或对象能够用于另一种类型的变量或对象可以使用的环境 例如 非常对象使用在常对象中 就是类型适应 反之则不是 includeclassK public K inti k i intsetk const returnk private intk intadd constK 形参为常引用 实参为非常对象 类型适应 常引用作形参 常成员函数 25 6 3 3常成员函数 使用const关键字进行说明的成员函数 const 说明 const是函数类型的一个组成部分 在函数实现部分必须带有const关键字 只有常成员函数才能操作常对象 6 3 3常成员函数 成员函数与对象之间的操作关系 includeclassM public M intx inty X x Y y voidMove intx inty X x Y y voidPrint const cout X Y endl private intX Y voidmain constMm1 1 2 m1 Move 3 3 m1 Print Mm2 3 4 m2 Move 3 3 m2 Print 一般成员函数 常成员函数 常对象m1 一般对象m2 错误 一般成员函数不能操作常对象 includeclassR intR1 R2 public R intr1 intr2 R1 r1 R2 r2 voidprint voidprint const 函数重载 voidR print cout R1 R2 endl voidR print const 常成员函数的实现 cout R1 R2 endl voidmain Ra 5 4 a print constRb 20 52 b print 结果为 5 420 52 6 3 4常数据成员 使用const来说明的数据成员 称为常数据成员 由于const类型对象必须被初始化 并且不能更新 因此 对于常数据成员只能通过成员初始化列表的方式并通过构造函数对其初始化 includeclassA public A inti voidprint constint A A inti a i r a 不能这样哟 结果为 100 10 1000 10 0 6 4 1子对象 子对象 当一个类的成员是另一个类的对象时 该对象就为子对象 子对象即对象成员 当类中出现了子对象 对象成员 时 该类的构造函数要包含对子对象的初始化 通常采用成员初始化列表的方法来初始化子对象 6 4 1子对象 例如 classA public private classB public private Aa a为子对象 a是B中的成员 成员初始化列表 B inti intj intk a i j b k 子对象a 对子对象成员函数的调用 输出 6 78 6 4 1子对象 C 中对含对象成员的类对象的构造函数有特殊的格式 类名 构造函数名 参数总表 对象成员1 参数表1 对象成员2 参数表2 对象成员n 参数表n 说明 子对象必须在成员初始化列表中初始化 建立一个对象时 它的所有子对象一起建立 先执行子对象构造函数 再执行对象的构造函数体 析构函数的执行顺序与构造函数的执行顺序严格相反 构造函数的调用顺序仅与子对象在类中声明的顺序有关 而与成员初始化列表中给出的对构造函数的调用顺序无关 构造函数的成员初始化列表中未给出对子对象的调用 则表示使用子对象的缺省构造函数 运行结果 6 4 2堆对象 1 堆对象 在程序运行过程中根据需要可以随时建立或删除的对象 2 堆对象运算符 new delete 1 new运算符 动态创建堆对象 new AA a1 newAA 1 4 new运算符返回一个与new所分配对象类型相匹配的指针 如果new运算符不能分配到所需要的内存 将返回0 这时为空指针 使用new运算符创建对象时 它可以根据其参数来选择适当的构造函数 1 new运算符 new创建数组 new 例如 A ptr ptr newA 5 使用new创建对象数组或一般数组时 不能为该数组指定初始值 其初始值为缺省值 使用new 创建对象数组时 类中必须说明缺省构造函数 2 delete运算符 功能 删除用new创建的对象或一般类型的指针 delete 例如 A ptr ptr newA 5 6 deleteptr 2 delete运算符 删除对象数组 delete 例如 A ptr ptr newA 5 delete ptr 注意 必须用于由运算符new返回的指针 该运算符也适用于空指针 即其值为0的指针 对一个指针只能使用一次delete操作 指针名前只用一对方括号符 并且不管所删除数组的维数 忽略方括号内的任何数字 includeclassAA public AA AA inti intj AA voidSet inti intj voidPrint private intA B AA AA A B 0 cout Defaultconstructorcalled endl AA AA inti intj A i B j cout Constructorcalled endl AA AA coutPrint a2 Print deletea1 deletea2 运行结果 includeclassB intx y public B x y 0 cout Constructor1 endl B inti x i y 0 cout Constructor2 endl B inti intj x i y i cout Constructor3 endl B cout Destructor endl voidprint cout x x y y endl voidmain B ptr ptr newB 3 ptr 0 B ptr 1 B 5 ptr 2 B 2 3 for inti 0 i 3 i ptr i print delete ptr 运行结果 6 5类型转换 类型的自动隐式转换构造函数的类型转换转换函数 6 5 1类型的自动隐式转换 类型转换是将一种类型的值映射为另一种类型的值 共包含自动隐含和强制两种 C 编译系统提供的内部数据类型的自动隐式转换规则如下 1 程序在执行算术运算时 低类型可转换为高类型 如 doublea a 3 9 4 2 在赋值表达式中 右边表达式值自动隐式转换为左边变量的类型 并赋值给它 如 longvar 10 3 当在函数调用时 将实参值赋给形参 系统自动隐式转换 4 函数有返回值时 系统自动将返回表达
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年秋新华师大版数学七年级上册全册同步教案
- 护理评估方法与技巧
- 2026全球用工合规白皮书-中国企业出海用工指南
- 员工工伤事故快速响应人力资源部预案
- 户外徒步旅行装备与安全常识指导书
- 智能制造产线精益化改造指南
- 电影院事情紧急演练预案
- IT运维工程师故障排查指导书
- 研发项目管理及产品开发流程模板
- 学会有效情绪管理保持积极心理状态小学主题班会课件
- GB/T 23510-2009车用燃料甲醇
- GB/T 1048-2019管道元件公称压力的定义和选用
- GA 1283-2015住宅物业消防安全管理
- 中等职业学校班主任能力比赛汽车运用与维修专业班级建设方案
- 储罐安全附件基础知识讲座课件
- 山西恒泰佳源生物科技有限公司新建年产15万吨乙酸钠项目环评报告书
- 分子设计育种课件
- 城市轨道交通服务员技能竞赛理论题库大全-下(多选、判断题库)
- (完整版)机械工程专业英语课件
- 110kV变电站设计计算书
- 施工方案通风排烟系统
评论
0/150
提交评论