版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+经典知识回顾 一、类的定义与应用在C语言中,我们学过结构体,用于将描述某一对象的若干变量包装成一个整体使用,但没有但没有将与该对象相关的函数包含进来。C语言中的结构体只能描述一个对象的特征(属性),不能描述一个对象的动作(方法)。在C+中,我们是通过类的定义来解决这个问题的,在类的定义中,不仅可以包含变量,还可以包含函数。我们通过一段程序来讲解类的使用。#include iostream.hclass CPointpublic:int x1;int y1;void Output(;CPoint(;CPoint(int x2,int y2CPoint(;private:int x2;int
2、y2;int *pCount;/注意类和结构定义完后,一定要用;号结尾,忘记;是许多人常犯的错误。/在c+中,/.用于注释一行,/*.*/可以注释多行。void CPoint:Output(if(pCount(*pCount+;elsepCount=new int;*pCount=1;coutthe first point is ( coutthe second point is ( CPoint:CPoint(pCount=0;coutthe first constructor is callingx2=x2;this-y2=y2;pCount=0;coutthe second constr
3、uctor is calling CPoint:CPoint(if(pCountcout你调用了Output成员函数共*pCount次 delete pCount;elsecout你还没有调用过Output成员函数 coutthe deconstructor is calling void Output(CPoint ptcoutthe first point is ( /coutthe second point is ( /上面被注释的语句会造成编译错误,因为不能从类的外部访问类中的私有成员。void main(if(1=1/限定pt变量的有效范围CPiont pt;coutpt.x1pt.
4、y1;/pt.x2=10;/pt.y2=10;/上面被注释的语句会造成编译错误,因为不能从类的外部访问类中的私有成员。pt.Output(;pt.Output(;pt.Output(;/故意演示Output被调用多次的情况。Output(pt;CPoint pt(10,10;pt.Output(;上面的代码定义了一个类CPoint,其中包含有变量,称之为成员变量,也包含有函数的声明,称之为成员函数。在类定义之外,我们必须对成员函数进行实现,成员函数的实现格式为:返回类型类名:函数名(参数列表函数体代码上面的代码也编写了一个名为Output的全局函数,注意与类CPoint中的Output成员函数
5、区别。上面的代码还编写了一个main主函数,其中的代码演示了如何使用CPoint类。C+中提供了一套输入输出流方法的对象,它们是cint和cout,cerr,对应c语言中的三个文件指针stdin,stdout,stderr,分别指向终端输入、终端输出和标准出错输出(也从终端输出)。cin与一起完成输入操作,cout,cerr与成员的方式访问其它的成员,如CPoint(int x2,int y2函数中用this-x2访问成员变量x2。在成员函数中,我们通常可以省略this-,直接访问类中的成员变量。在CPoint(int x2,int y2函数中,由于函数参数变量x2,y2与成员CPoint中的
6、成员变量x2,y2同名,要在该函数中访问成员变量x2,y2,可用this-x2,this-y2与参数变量x2,y2区分。小技巧:在以后的MFC编程中,如果在成员函数中想调用同类中的某个成员,可以使用VC+提供的自动列出成员函数功能,使用this-,VC+将列出该类中的所有成员,我们可以从列表中选择我们想调用的成员。自动列出成员函数功能,可以提高编写速度,减少拼写错误。特别是我们不能完全记住某个函数的完整拼写,但却能够从列表中辨别出该函数时,自动列出成员函数功能更是有用。事实上,在各种IDE编程环境中,我们通常都没有完全记住某些函数的完整拼写,只是记住其大概写法和功能,要调用该函数时都是从自动列
7、出成员函数中选取的。这样能够大大节省我们的学习时间,我们没有花大量的时间去死记硬背许多函数,利用自动列出成员函数功能和帮助系统,却也能够在编程使顺利使用这些函数,等用的次数多了,也就在不知不觉中完全掌握了这些函数。注意比较Output全局函数与Output成员函数的差别。对Output全局函数的调用,可以理解成“输出某个pt点的坐标”,是一种谓宾关系,是面向过程(或函数)Output的。对Output成员函数的调用,可以理解成“pt这个点对象执行输出动作”,是面向对象pt的。希望通过这样的比较,能够有助于读者理解c+中关于面向对象的概念。四、类的继承与protected访问修饰符:类是可以继承
8、的,如果类B继承了类A,我们称A为基类(也叫父类),B为派生类(也叫子类)。派生类不但拥有自己新的成员变量和成员函数,还可以拥有基类的成员变量和成员函数。派生类的定义方法是:class派生类名:访问权限 基类名称.;要实现类B与类A的继承关系,我们在定义类B之前必须已定义了类A,并用如下的格式定义类B。class B:public或private A.;讲到类的继承后,我们再讲解另一种成员访问权限修饰符,protected。public,protected,private三种访问权限的比较:public定义的成员可以被在任何地方访问。protected定义的成员只能在该类及其子类中访问。pri
9、vate定义的成员只能在该类自身中访问。派生类可以用public和private两种访问权限继承基类中的成员,如果在定义派生类时没有指定如何继承访问权限,则默认为private。如果派生类以private继承基类的访问权限,基类中的成员在派生类中都变成private类型的访问权限。如果派生类以public继承基类的访问权限,基类中的成员在派生类中仍以原来的访问权限在派生类中出现。注意:基类中的private成员不能被子类访问,所以private成员不能被子类所继承。我们分析如下代码:class CAnimalpublic:void eat(;void breathe(;void CAnimal
10、:eat(couteating void CAnimal:breathe(coutbreathing class CFish:public CAnimalpublic:void swim(;void breathe(; void CFish:swim(coutswimming void CFish:breathe(CAnimal:breathe(;coutbreathingbreathe(;关于类的继承及类的访问特性可以参照如下表:基类的访问特性类的继承特性子类的访问特性PublicProtectedPrivatePublicPublicProtectedNo access1PublicPro
11、tectedPrivateProtectedProtectedProtectedNo access1PublicProtectedPrivatePrivatePrivatePrivateNo access1由于CFish继承了CAnimal,所以在main函数中用CFish定义的对象f可以将CAnimal中定义的eat(成员函数当作自己的成员函数调用。f还调用了CFish中新定义的成员函数swim(。对象f还调用了breathe(函数,大家发现在基类CAnimal和派生类CFish中都定义了breathe函数,在这种情况下调用的到底是哪个类中定义的函数呢?在这里,调用的是子类CFish中定义的
12、函数。如果在子类与父类中都定义了同样的函数,当用子类定义的对象调用这个函数时,调用的是子类定义的函数,这就是函数的覆盖。函数的覆盖,我们可以用生活中的例子来比喻,儿子继承了父亲的许多方法,包括“结婚”这一行为,但父亲“结婚”用的是花轿,而儿子“结婚”用的却是汽车,儿子不能使用父亲“结婚”的方式。如果儿子结婚时,即要花轿,也要汽车,也就是在子类的成员函数定义中,要调用父类中定义的那个被覆盖的成员函数,其语法为,父类名:函数名(参数。如CFish定义的breathe函数中使用的CAnimal:breathe(语句,就是调用CAnimal中的breathe函数。在程序中main函数的结尾处的代码:C
13、Animal *pA;pA=&f;pA-breathe(;上述代码定义了一个CAnimal类型的指针pA,pA指向CFish定义的对象f的地址,用指针pA去调用breathe函数,在这种情况下调用的到底是哪个类中定义的函数呢?简单的死记硬背只能管一时,不能管一世。我们还是从类型转换的原理上寻找答案。将鱼CFish对象的首地址直接赋值给动物CAnimal类型的指针变量,是不用强制类型转换的,编译器能够自动完成这种转换,子类对象指针能够隐式转换成父类指针。这个过程好比现实生活中将一条鱼当作一个动物是没有什么问题的,但要将一个动物当作鱼来对待是存在问题的。如果某一动物确实是一条鱼,我们就可以将这个动物强制类型转换成鱼。也就是说,要将父类类型的对象转换成子类对象,在程序中必须强制类型转换,编译才能通过,但要保证内存中的对象确实是那种被转换成的类型,程序在运行时才不会有问题。我们可以这样想象类型转换,用目标类型的内存布局,去套取要类型转换的对象的首地址开始的那一段内存块(大小为目标类型的大小),套取的内容即为转换后的结果。见图x,&f转换成pA后,转换完后的内容包含的breathe是CAnimal中定义的那个。五、虚函数与多态性。如果我们在CAnimal中定义的void breathe(函数前增加virtual关键字,即改为如下定义:c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数字普惠金融对农村消费升级的影响研究
- 2025年期货法律考试题型及答案
- 2025四川九洲投资控股集团有限公司软件与数据智能军团招聘开发工程师(校招)等测试笔试历年参考题库附带答案详解
- 2025上海青浦文旅发展(集团)有限公司自主招聘笔试历年参考题库附带答案详解
- 2025广东深圳大学师范学院附属中学急聘初中语文教师1人考试模拟卷附答案解析
- 2025年昆明市盘龙区引进银龄讲师(2人)考试历年真题汇编附答案解析
- 2025年广西来宾市政府采购评审专家考试真题(附含答案)
- 2025年临沧高新技术产业开发区管理委员会招聘(4人)考试模拟卷附答案解析
- 2025年政府专职消防员职业技能竞赛考试题库(有答案)
- 2025年药店店员考试题库及答案
- 老年人面瘫针灸治疗课件
- 儿科水痘患儿护理措施
- 金矿山合作开采协议书
- 2024年税务师考试真题及答案解析
- 皇帝的新装课本剧课件
- 《3.5摆的快慢》教学设计 -2024-2025学年教科版科学五年级上册
- 铁路建设项目穿透式安全管理题库及答案解析
- 柯达伊小星星手势课件
- 肌筋膜疼痛综合征触发点运动前激活与放松方案
- 2025年农村应用文写作试题及答案大全
- 2025至2030中国光谱红外探测器行业项目调研及市场前景预测评估报告
评论
0/150
提交评论