




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC类基础,C+程序编写规范介绍由于本文是面对C语言基础的(因为我就是从C学起来的),而MFC是利用C+类技术构建起来的。因此有必要在此为只了解C的朋友们,普及一下C+语言中类的概念。熟悉C+的朋友可以跳本部分。从总体来说C+是向下兼容C的,你可以很不费力气地将用C编好了的程序拿到C+环境下编译执行。其C+只不过是在C的基础上添加面向对象技术(OOP),也就是类的概念,且值得一提的是C与C+都是由美国的贝尔实验室(在之前我只知道发明过电话)发明的。什么是类?按一些书本上的定义来说“就是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。因此,类中的数据具有隐藏性,类还具有封装性。”嗯,类还像上面的那句话一样,具有很强的抽象性。让我来用一个例子来解释类吧。嗯,我们世界上有一个生物种类叫做鸟,在C+上世界我们也可以制作一个类叫做鸟类。它应该有头,有躯干,有腿,有内脏,还有一个非常重要的翅膀。于是,其类描述如下:class Aves char m_strHead10; char m_strTrunk10; char m_strCrura10; char m_strWing10; char m_strBowels10;哈,这样一个鸟类建立好了,怎么样与C中结构体没什么两样吧。(在C+中struct与class基本上是同义词,过一会儿会说到它们有什么不同的。)如果你想建立一个小鸟的话,不用像C中那样麻烦地打struct Aves XXX,而是直接使用Aves XXX就可以了,不打前面的struct或class。在人类对鸟类形成概念之前,鸟的翅膀、躯体等等就真的存在了(没有人有疑议吧?),但在人们根本不知道鸟的那对长满羽毛的扑扇扑扇就可以飞的东西叫什么名字,也不会知道翅膀这个词指的是什么意思。现在我们的这个C+鸟类也正处于这个状态,在那些成员变量中没有被赋与任何值。而现实生活中,一个种类中的具体名字是在一个类对象形成初期被命名的,这是一个名词初始化的过程。在C+类中,当建立一个类对象时总也要有一个初始化各成员变量的过程,于是构造函数被引入了。它在一个实例被声明和被建立(这两个有一些区别)时调用。我们的C+鸟类各个成员变量的赋值命名就可以利用它来实现:class Aves Aves () strcpy(m_strHead, Head); strcpy(m_strTrunk, Trunk); strcpy(m_strCrura, Crura); strcpy(m_strWing, Wing); strcpy(m_strBowels,”Bowels”); char m_strHead10; char m_strTrunk10; char m_strCrura10; char m_strWing10;瞧,我是怎么在类里面建立一个构造函数的。一个类的构造函数的名字要与其类名同名,且不能有返回值,void也不行。我们在构造函数中,对各个成员函数命名。当Aves bird;时(声明一个bird对象),Aves类的构造函数将会被调用,把bird.m_strHead,bird.m_strTrunk等等成员变量分别赋值为”Head”,”Trunk”。这样一讲,希望大家对构造函数有了一定的了解了。我们既然有构造函数可以对类成员进行初始化,那么用什么来对类成员销注呢?说白了就是有在建立类对象时调用的函数,什么函数是在类对象被删除时调用的函数呢?那就是析构函数,其命名规则与构造函数是一样的,只不过需要在其函数名前紧加一个(波浪号),且不能有参数。如我们的类就是Aves();至于析构函数具体作用嘛举个例子来说,当在构造函数中申请了一段内存,我们就必须在析构函数中释放这段内存,否则会内存泄漏。那么什么时候会引发声明的类对象被删除呢?要解决这个问题,我还需要借用一个叫名域(name space)的概念。当系统执行指针离开声明的类对象所在名域时,就会引发类对象的删除(类型的有效型也可以如此解释)。而名域这个概念最实称的理解就是一对大括号,在这对括号内的空间就是一个名域。(当然名域其实不是这么简单的。如类本身就是一个名域,还可以自己设定一个名域,用于类型声明设定,可以用已有的类型冲突。名域真实用途是这个。具体含义参见C+标准库,图书大厦有侯捷先生的译本)比如:/名域1 char * strValue; /名域2 Aves bird; /名域3 strValue=bird.m_strWing; /就在后大括号这里引发了bird对象的析构函数strValue=”Blue Atlantis”;这里有3个名域,我在名域2中声明了一只小鸟。因为名域3也被包括在名域2里,所以名域3中的空间也属于名域2,于是在名域3中引用小鸟对象是正确的。当执行指针离开名域2那一瞬,C+系统将会把在名域2中声明的所有变量及对象删除掉。当对象被删除时,首先会执行析构函数,然后系统再去释放对象所占用的内存空间。所以当执行到strValue=”Blue Atlantis”;这一句时,这只小鸟就已经不存在,再去引用它就会编译错误。另外,要讲一讲对象的建立。一种是像变量一样声明建立起来对象,像上面的Aves bird;另一种就是用new语句来建立起来对象。如:Aves *bird;bird= new Aves();new语句跟着一个类的构造函数,它会在内存建立起来一个对象,并把这个对象的指针返回出来。这样建立起来的对象没有名域空间的限制。如果要将这个对象删除掉必须手动的使用delete语句。如:delete bird;delete后面跟着指向要删除对象的指针变量。注意,这个指针变量的类型直接影响到对象的删除时所使用的析构函数。所以,什么类型的对象,就要用什么类型的指针来指向删除。真实的鸟类应该是可以飞翔(绝大部分),可以发出叫声,可以在陆上跑(至少可以跳)。所以我们也应该让我们的鸟类也可以跳,可以飞吧。于是,我要向类中添加成员函数。声明成员函数可以有两种方法,一种是在类的声明体里面,像上面例子中构造函数的声明方法,另一种是在类的声明体外面。外部的表现写法为返回值 类名:函数名(参数列表)。注意:是由于两冒号组成。下面的代码就是使用第二种声明方法(当然,两种方法可以混用):#include #include class Avespublic: Aves (); Aves (); void tweet(); void run(); void fly(); char m_strHead10; char m_strTrunk10; char m_strCrura10; char m_strWing10;private: char m_strBowels10;Aves:Aves() strcpy(m_strHead, Head); strcpy(m_strTrunk, Trunk); strcpy(m_strCrura, Crura); strcpy(m_strWing, Wing); strcpy(m_strBowels, Bowels); couta bird born!endl;Aves:Aves() couta bird die!endl;void Aves:tweet() coutjijijijijijijiendl;void Aves:run() coutI can run by m_strCruraendl;void Aves:fly() coutI can fly by m_strWingXXX成员。this是一个本类的指针,在这个类中就是Aves*。它代表当前实例对象的指针,在bird对象中应用run()时,this就是&bird。可以将run函数改写为void Aves:run() coutI can run by m_strCruraendl;讲了这么多,相信大家应该可以写一个自己的类了吧?快用你的VC,建立一个Win32 Console Application工程,用新建Files向工程添加一个C+ Source file文件,来试试写一个自己的C+程序吧。接着,要来说说类的继承。再拿鸟类来举例子吧。鸟类还可以细分成很多类,鸡啊,鸵鸟啦,什么的。它们都是鸟类,在整体上有着共同的特征和行为,但也有其它不同点。C+类中也会存在相似的地方。怎么办?重新再写一个类,重新再写那些相同的成员吗?这时就需要继承了。我们可以写这样一个类:class Ostrich : public Aves继承的写法为:class 派生类名 : 权限关键字(在VC中一般为public) 基类名,基类名2这个Ostrich类继承于Aves类,Ostrich类现在就拥有Aves类中所有的成员。如果从Ostrich类声明一对象aOstrich,就可以直接调用其aOstrich.run()。实际上就是在调用Aves类中run成员函数。现在要是在Ostrich类上添加成员的话,就是在Aves类的基础上添加成员。需要说的,在Aves类中有一个私有成员m_strBowels。因为其是私有成员,所以对于其派生类Ostrich也是不可见的。为了解决这个问题,需要将Aves类中的private关键字改为protected关键字。将m_strBowels成员描述为保护型。保护型,对其派生类是可见,对于外部
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 森林防灭火知识培训简讯课件
- 森林管护培训课件
- 森林消防知识培训
- 森林安全知识培训简报课件
- 2.1住宿革新乡宿品牌的打造与推广2024040376课件
- 2025年新闻媒体行业编辑岗位招聘笔试预测试题集
- 2025年PMP项目经理认证考试题库及答案
- 2025教师资格考试题库及答案
- 2025年建筑设计师招聘考试模拟题及解题技巧
- 2025年边防巡逻员招聘面试常见问题与答案
- 电子工厂品质意识培训
- 《农村基层干部廉洁履行职责规定》知识培训
- 符合标准2025年乡村全科助理医师考试试题及答案
- 2025年矿产权评估师练习题及参考答案一套
- 中职新能源汽车专业实训虚实结合教学模式创新研究
- 2025年《新课程标准解读》标准课件
- 员工培训内容与进度记录表
- 《分娩指导及助产技巧》课件
- 幼儿园晨间活动教研培训
- 浙江省建设工程检测技术人员(建筑材料及构配件)认证考试题库(含答案)
- 图像数据采集与处理方法-洞察分析
评论
0/150
提交评论