面向对象程序设计(类与对象) [兼容模式].pdf
《面向对象程序设计(类与对象) [兼容模式].pdf》由会员分享,可在线阅读,更多相关《面向对象程序设计(类与对象) [兼容模式].pdf(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2009/10/301 5.类与对象 5.1 面向对象的思想 类与对象是面向对象程序设计OOP(Object-Oriented Programming)的基础,是c+区别于c的主要特征 面向对象与面向过程的区别 函数与它所操作的数据密切相关,相互依赖,特定的函数往往对特定的数据结构进行操作 数据结构的改变对相关函数的影响 面向过程:难于调试和修改。类是指具有相同的属性和操作,并遵守相同规则的对象的集合。类与对象的关系。类是对象集合的抽象,对象是类的一个实例。消息作为对象之间沟通的桥梁 消息包括:目标对象名字,请求方法,参数 5.2 面向对象程序设计的特点 抽象 数据抽象:定义了对象的属性和状态
2、。代码抽象:定义了对象的共同行为特征或具有的同样功能。封装 数据成员和代码。对象自身以及程序如何引用对象的数据?对象内访问,对象外访问。对象可以拥有私有成员隐藏细节。优点:独立性,保护内部数据,易维护。继承(重用性)一种联结类与类的层次模型。一种明确表述共性的方法。派生类继承的手段。派生类(子类),基类(父类)。多态性 允许不同类的对象对同一消息作出响应。多态性主要体现在:函数重载、虚函数。例如基类和派生类可以有同名函数,定义不同的操作(一个接口,多种方法)。OOP的优点:开发时间短,效率高,可靠性高。代码重用性高,易于维护,易于更新升级。难点:如何将OOP的概念,渗透到实际的业务模型当中。2
3、009/10/302 5.3 类与对象 类的定义 数据成员(类的属性)成员函数(类的方法)构造函数,析构函数 运算符函数 Example:li class pointpublic:unsigned x,y;void ShowMe()coutx“,”y成员”来访问。类内的其他成员也可以访问。protected保护:类以外的程序不允许访问这个成员,只有这个类的成员才可访问。通过类对象不可直接调用。private私有:类以外的程序不允许访问这个成员,只有这个类的成员才可访问。通过类对象不可直接调用。类型定义默认情况下都是私有的。protected和private的区别。主要体现在继承和派生过程中20
4、09/10/303 内联成员函数 关键字inline来修饰。直接在类的定义中定义成员函数的函数体。P104 类的成员函数可以重载,也可带默认参数。对象 类的实例。对象的使用 P105 example 7.3 1.成员函数访问类中的数据成员,或调用其他成员函数可以直接使用数据成员名或成员函数名。2.在对象外访问该对象的数据成员或成员函数需要使用运算符“.”class.fun1();3 在对象外直接访问一个对象的私有或者保护成员属 3.在对象外直接访问一个对象的私有或者保护成员属于非法操作,导致编译错误。4.同类对象之间可以整体赋值。类似于C/C+语法中的structure之间整体赋值。class
5、 obj1,obj2;obj1=obj2;5.对象作为函数参数时属于赋值调用。对象可作为函数返回值。5.4构造函数和析构函数 构造函数(决定了类的对象如何创建、初始化、复制)定义了创建对象的方法,提供了初始化对象的一种简单手段。定义:类名:类名(行参表);注意:构造函数与类同名,没有返回值。定义可以在类外,也可以是内联,允许重载。析构函数(决定了类的对象如何撤销)与构造函数对应。当一个对象的生存期结束时,系统将自与构造函数对应。当个对象的生存期结束时,系统将自动调用构析函数来撤销该对象,释放该对象占用的内存空间及一些其它操作。规则:类名:类名();注意:1.构析函数的名称与类名相同,只是最前面
6、要加波浪号“”,表示与构造函数的区别。不可带任何参数,不能重载,没有返回类型 P106 example 7.4 编译器在创建对象时,执行构造函数。构造函数可带参数,可以有默认参数 5.5 数据成员初始化p108 1.在构造函数体内进行初始化。带参数 不带参数 2.在构造函数的头部进行初始化 类名:构造函数名(行参表):变量1(初值1),变量2(初值2)变量(初值)函数体2(初值2),.,变量n(初值n)函数体 3.混合初始化 1.2.两种方法的结合 4.拷贝构造函数 用一个已经存在的该类的对象来初始化另一个该类的对象 行参是本类的对象的引用。构造函数名(类名&变量);变量与构造函数属于同一个类
7、。2009/10/304 5.6 对象与指针 可以定义指向对象的指针,将类名看作一种变量类型,定义类的指针与定义变量的指针方法相同。成员运算符-指针必须要分配内存空间 example 7.5须p this指针对象自身的地址。每个类成员函数都包含一个与它自身类型相同的指针。该指针是指向对象自身的地址。可以通过this来访问该对象内部的所有成员变量和函数。5.7 const修饰符 区别c语法中的常量的定义方式,#define.规则:const 类型 变量名常量值;const int pi=3.1415;常量必须在声明时赋值,在程序中不能改变其值。相当于锁存。在说明引用的时候用const修饰,表示被
8、修饰的引用称为常引用。常引用所引用的对象是不能被更新的。称为常引用常引用所引用的对象是不能被更新的 常引用作行参,实参不会被改变。const可以修饰对象,const对象只能访问其中也用const修饰的成员函数。const成员函数不能修改任何数据成员。注意const成员函数定义时的const的位置。一般对象可以调用任何类型成员。5.8 MFC的CString类。#include“Afx.h”,Win32 SDK模式的程序需要手动添加;MFC AppWizard创建的框架中,自动添加;相关成员函数;Both ANSI and Unicode character types with CRTtCRT
9、 support;P111页,字符串截取函数,查看字符串信息,转换函数,内容修改函数,格式化输出 CString与零结尾的字符串的兼容性;LPCTSTR,char*类型可以与CString兼容。5.9MFC的CTime类和CTimeSpan类 5.10 类的嵌套 程序设计举例分析:p117 example 7.62009/10/305 6 继承与派生(代码重用)面向对象程序设计语言基本特征之一。表达基类与派生类之间特定关系的一种机制,该机制自动为派生类提供来自基类的操作和数据。6.1 派生类的定义 规则:class 派生类名:继承方式 基类名1,继承方式基类名2,.,继承方式 基类名n 派生类
10、增加的成员声明;单继承,多继承 基类一定是已经存在的类,派生类一定是一个新的类。继承方式:1.public 2.protected 3.private 默认是私有(private)继承 派生类中的变化 派生类继承除了构造函数和析构函数之外的基类的所有成员的所有成员。1.派生类对基类的扩充。增加新的成员。2.派生类对基类的改造。对基类成员的访问权限的改变,或者对基类成员函数进行重定义。注意:区分重载和同名覆盖的区别。(作用域之间的区别/名字空间)6.2 派生类的继承方式 1.公有继承public基类公有成员派生类公有成员基类保护成员派生类保护成员基类私有成员派生类内部,外部 注意:派生类成员函数
11、可以像访问自身保护成员一样访问基类保护成员,但派生类的使用者无法通过派生类对象访问基类的保护成员。Example 8.1都无法访问 2.私有继承private基类公有成员派生类私有成员基类保护成员派生类私有成员基类私有成员派生类内部,外部都无法访问 注意:派生类中,基类的公有、保护成员都无法访问。Example:8.22009/10/306 3.保护继承protected基类公有成员派生类保护成员基类保护成员派生类保护成员基类私有成员派生类内部,外部都无法访问都无法访问 4.友元函数和友元类 允许外部函数或类具有该类内部成员的特权。意味着,友元可以对类内部的所有资源进行访问。通过关键字“fri
12、end”来进行说明。Exampleclass Personint m_nSalary;public:friend void ChangeSalary(Person p,int nNewSalary);void ChangeSalary(Person p,int nNewSalary)p.m_nSalary=nNewSalary;友元具有访问类内部私有成员的权利。注意友元函数的声明、定义与成员函数的声明、定义的区别。class CFriend;class Personfriend class CFriend;class CFriend.类在被声明成友元类之前,一定要先进行声明。6.3 派生类的构
13、造函数和析构函数 基类的构造和析构不能被继承 基类中被继承的成员的初始化应该仍然由基类构造函数来完成。基类的构造函数的参数设置在派生类中进行。基类对于派生类来说是隐含的,在派生类中存在一个隐含的基类的对象。1.派生类构造函数 规则:派生类名:派生类名(参数总表):基类名1(参数表1),基类名n(参数表n),内嵌对象名1(对象参数表1),内嵌对象名m(对象参数表m)派生类新增成员初始化;2009/10/307 注意:1.派生类属于多继承时,声明中会出现多个基类名。2.若基类使用默认构造函数和不带参数的构造函数,则在派生类声明中可以略去“基类名(参数表)”。3.若派生类以及内嵌对象都不需要初始化,
14、则可以不定义派生类构造函数,使用默认构造函数。4.参数总表包含全部基类和全部内嵌对象的所有参数,同时也应该包含派生类新增成员初始化的参数。注意 注意:两种情况必须定义派生类的构造函数:1.是派生类本身需要;2.是基类的构造函数带有参数。派生类构造函数的执行次序:首先:调用基类构造函数。多继承时,按照继承顺序执行。其次:调用内嵌对象构造函数。按照声明顺序。最后:执行派生类构造函数体中的内容。Example:8.3 派生类的析构函数 执行过程与构造函数相反。6.4 显式访问基类成员 规则:类名:成员变量名;类名:成员函数();功能 1.同名覆盖情况下,访问基类同名函数对象名.类名:成员名;2.多继
15、承情况下,多个基类拥有的同名成员在派生类2.多继承情况下,多个基类拥有的同名成员在派生类中产生二义性。P130页 6.5 静态成员 程序中所有同类对象共享。使用static修饰。属于引用性的说明。静态数据成员存放在静态存储区内,该存储区内的数据为类的所有对象共享。静态成员函数可以说明为内联,但不能说明成虚函数。静态成员函数中没有this指针。可以直接访问,不能直接访问非静态成员(非静态成员的访问必须借静态成员助对象名非静态成员。(非静态成员的访问必须借静态成员助对象名,或指向对象的指针)。类中启动线程。一般将访问静态数据成员的函数说明成静态的。2009/10/308 6.6 类模板 模板类的定
16、义方式:template class 类名;Example:P132页,8.4 7 多态性 7.1 概述 某一类的对象在接收到同样的消息时,做出的响应不相同。即调用名称相同的成员函数,函数实现的功能不同。绑定:是确定操作具体对象的过程,即把一绑定:是确定操作具体对象的过程,即把个标识符和一个存储地址联系在一起的过程,把一条消息和一个对象的方法相结合的过程。编译时多态性和运行时多态性 编译时多态性 同一类的不同对象或是同一个对象在不同的环境下,调用名称相同的成员函数,所完成的功能不同。编译连接阶段完成绑定工作,静态绑定。优点:访问方法时没有运行时间开销,绑定在程序执行之前进行。缺点:必须经过编译
17、程序才能实现静态绑定。运行时多态性 属于同一基类的不同派生类对象,在形式上调用自基类继承的同成员函数时实现调用了各自派生类的同名函数成员的同一成员函数时,实现调用了各自派生类的同名函数成员。编译在程序运行阶段进行,动态绑定(晚期绑定,后绑定)。优点:无需重新编译程序。缺点:运行时开销大于静态绑定。Example:P141,142 7.2派生类对象替换基类对象 公有派生类全盘继承了基类的成员及其访问权限,因此公有派生类对象可以替代基类对象完成本来由基类对象所完成的工作。替换原则:派生类对象给基类对象赋值派生类对象可以初始化基类对象可以令基类对象的指针指向派生类对象,即派生类对象的地址传递给基类指
18、针。Example:9.1 P142 注意:派生类对象替换基类对象后,只能当作基类对象来使用,无论派生类是否存在同名覆盖成员,基类对象所访问的成员只能来自基类。派生类替换基类对象,可以用基类对象指针指向派生类对象,但只能访问从基类继承的成员。2009/10/309 7.3 虚函数 替换原则:派生类替换基类对象,可以用基类对象指针指向派生类对象,但只能访问从基类继承的成员。虚函数使得能够通过指向派生类的基类指针访问派生类中的同名覆盖成员函数。条件:基类定义中,该函数被声明为虚函数。规则:virtual 返回类型 函数名(形参表);虚函数的使用限制 1.应该通过指针或引用调用虚函数,而不要通过对象
19、名来调用虚函数。因为通过对象名调用的只能是基类的成员函数。2.在派生类中重定义的基类虚函数在派生类中仍然是虚函数,virtual关键字可以省略。虚函数重定义时,返回类型,函数名,形参表一定要与基类的虚函数完全致(区别于函数重载)类的虚函数完全一致。(区别于函数重载)。3.不能定义虚构造函数,可以定义虚析构函数。因为多态性在对象创建之前,消亡之后是没有意义的。7.4 抽象类 类是从相似对象抽取共性而得到的抽象数据类型。类的抽象程度越高,就能概括更大范围内事物的共性。从软件设计的角度来说,基类的抽象程度越高,代码的重用性越强。抽象类的提出:最底层的基类,其成员函数的实际意义已经非常微弱,只有其声明
20、仍有意义。1.纯虚函数 Virtual 返回类型 函数名(行参表)0;纯虚函数在基类中声明后,不能定义其函数体。纯虚函数的具体实现只能在派生类中完成。2.抽象类 至少包含一个纯虚函数的类,称作抽象类。使用要求:使用要求:1.抽象类不能实例化,即不能声明抽象类对象。2.抽象类只能做为基类被继承,无派生类就没有意义。3.可以定义指向抽象类的指针或引用,这个指针或引用必然是指向派生类对象的。Example:9.3 P1462009/10/3010 7.5 运算符重载 给某个运算符定义新的含义和操所方法。体现了OOP技术的多态性。将运算符看作成函数来使用。规则:类型 类名:operator操作符(形参
21、表)“类型”即为函数的返回类型,指明了该操作符所适用的数据类型。“操作符”即是要重载的运算符,除了“:”,“.”,“*”(访问指针内容的操作符),“?:”以外。左操作数因该是类的对象本身。重载的运算符的优先级和结合性应该保持与其原始运算符相同。example:9.4 P148 7.6 文件处理(移至第三部分)7.7 异常处理机制 管理程序运行期间错误的一种结构化方法。异常处理机制将程序中的正常处理代码与异常处理代码明显的区分开来,提高了程序的可读性。可读性。基本思想:检测与处理分开 Throw/try/catch 一个try可以与多个catch相联系。多个catch对应了多个错误类型的处理操作
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 兼容模式 面向对象程序设计类与对象 兼容模式 面向 对象 程序设计 兼容 模式
限制150内