面向对象程序设计课件_第1页
面向对象程序设计课件_第2页
面向对象程序设计课件_第3页
面向对象程序设计课件_第4页
面向对象程序设计课件_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、面向对象程序设计第 3 章 面向对象程序设计【学习目标】【学习目标】 l l理解对象和类的概念理解对象和类的概念l l定义并实例化类对象定义并实例化类对象l l理解类的继承理解类的继承l l掌握类的静态数据成员和静态方法掌握类的静态数据成员和静态方法l l掌握运算符重载技术掌握运算符重载技术补充:虚函数补充:虚函数面向对象程序设计【学习导航】【学习导航】 面向对象程序设计【知识框架】【知识框架】 面向对象程序设计理解对象和类的概念理解类的继承运算符重载技术定义并实例化类对象类的静态数据成员和静态方法面向对象程序设计【参考书籍】【参考书籍】 1.C/C+程序设计教程 龚沛曾,杨志强 高等教育出版

2、社2.C+程序设计 谭浩强 清华大学出版社面向对象程序设计本章目录n3.1 类和对象n3.2 类的继承n3.3 类的高级方法n3.4 类模板n3.5 异常处理n3.6 课后练习面向对象程序设计3.1 类和对象n深入理解类和对象n类的定义n类的实例化对象n类成员的访问n类成员的访问权限n构造函数n析构函数nthis指针面向对象程序设计深入理解类和对象 世界中的各种事物,如花、鸟、鱼、虫,都有自己的特征。花具有美丽的色彩,鸟具有一对翅膀这些事物也都有自己的行为,花能够生长,鸟能够鸣叫,鱼能够游动在面向对象程序设计中,将事物的特征和行为组织在一起,便形成了类。在类中,事物的特征被描述为数据成员,行为

3、被描述为方法。 类的本质:一种自定义的数据结构面向对象程序设计回顾结构体n一个描述“狗”的结构体struct Dog unsigned int m_Age; unsigned int m_Weight;面向对象程序设计类的定义类是结构体的扩展,除了成员变量,还可以有成员函数。一个描述“狗”的类:class CDog /数据成员 unsigned int m_Age; unsigned int m_Weight; /方法 void yelp();面向对象程序设计引例class CDogpublic: /成员变量 unsigned int m_Weight; unsigned int m_Age;

4、 /成员函数void yelp()printf(汪汪!n);void main(int argc, char* argv) CDog mydog; mydog.m_Age = 2; mydog.m_Weight = 4; printf(Age=%dn,mydog.m_Age); printf(Weight=%dn, mydog.m_Weight); mydog.yelp();面向对象程序设计类的实例化对象 对象是类的实例化。在声明一个类时,并没有为其分配内存空间,只有在实例化一个对象时,才为对象分配空间。声明一个对象和声明一个整型变量类似。 下面声明了一个整型变量i和一个CDog类对象mydo

5、g。 int i; CDog mydog;/声明一个对象面向对象程序设计类成员的访问 在定义一个类的对象之后,就可以通过对象访问类的成员了。在对象之后使用“.”运算符访问类成员。 下面的代码演示了如何设置mydog的a_Age成员变量,如何调用mydog的yelp方法。 mydog.m_Age = 2; mydog.yelp();面向对象程序设计类成员的访问权限类成员有三种访问权限(安全级别)1.public(公有) 类内可访问,对象可访问类内可访问,对象可访问 一般可让用户随意使用的成员可设置成public2.private(私有) 类内可访问,对象不可访问类内可访问,对象不可访问 不希望用

6、户随意操作(例如怕造成不良后果)的成员可设置成tected(保护) (下节详解)面向对象程序设计类成员的访问权限class CDog /私有成员 unsigned int m_Age;protected: /保护成员 unsigned int m_Weight; int main(int argc, char* argv) CDog mydog; mydog.m_Age = 2; /错误,不能访问私有成员 mydog.m_Weight = 10; /错误,不能访问保护成员 return 0;面向对象程序设计构造函数 在建立一个对象时,常常需要对对象进行初始化,为了进行初

7、始化工作,C+提供了一个特殊的成员函数构造函数(constructor)。 构造函数是一个与类名相同的方法,可以根据需要设置参数,但不具有返回值. 在开发程序时,用户可以自己定义一个默认的构造函数,只要构造函数没有任何参数就可以了。 下面的代码定义了一个CDog类,在该类中定义一个默认的构造函数,用于初始化成员变量。面向对象程序设计构造函数例子classCDogpublic:unsignedintm_Weight;unsignedintm_Age;CDog();/默认构造函数默认构造函数;CDog:CDog()m_Age=1;m_Weight=2;printf(constructinstanc

8、en);intmain(intargc,char*argv)CDogmydog;/调用默认的构造函数调用默认的构造函数printf(%d,mydog.m_Age);return0;面向对象程序设计构造函数编译器除了提供默认的构造函数外,还提供了默认的复制构造函数复制构造函数。在一个函数中,按值传递一个对象或是将对象作为函数的返回值,均会调用类的复制构造函数。所有的复制构造函数均只有一个参数,即该类的对象的引用。因为复制构造函数的目的是生成一个对象的拷贝,所以参数是类的对象的常量引用,即在复制构造函数中不允许修改参数。下面的代码声明了一个CDog类的复制构造函数。CDog(const CDog

9、& theDog)当按值传递一个对象作为函数参数或者函数返回一个对象时,编译器将调用复制构造函数重新构造一个对象。下面的代码演示了复制构造函数的调用。在CDog类中定义一个复制构造函数,并在函数中输出一个语句。面向对象程序设计析构函数析构函数是与构造函数是相对的,它是在对象被撤销后清除并释放所分配的内存。析构函数与类同名,只是前面有一个“”号。析构函数没有返回值,也没有参数。例如,CDog类的析构函数声明:CDog();面向对象程序设计析构函数例子class CDog CDog();CDog:CDog() printf(destructor function was invokedn)

10、; Main() 面向对象程序设计3.2 类的继承n单一继承n多重继承n虚继承面向对象程序设计单一继承 面向对象的最大特点是实现了继承。开发人员能够根据已有类派生一个新类,新类继承了父类所有公有和受保护的数据成员和方法。类的继承是指派生类可以全部或者部分的继承基类的特征,同时加入所需要的新特征和功能。简单来说,派生类可以有选择的继承基类的某些数据成员和方法,同时定义一些新的数据成员和方法。新的类继承了原有类的特性,被称为原有类的派生类或子类,原有类被称为新类的基类或父类。而单继承就是以一个基类派生新类。 在派生一个新类时,使用class关键字,其后是类名称、冒号、访问限定符(public、pr

11、ivate、protected)、基类名称。面向对象程序设计单一继承 class CAnimalprotected: char* m_Name;/名称 char* m_Color;/颜色public: char* GetName(); char* GetColor(); void SetName(char* name); void SetColor(char* color); void Move(); CAnimal(); CAnimal(); char* CAnimal:GetName() return m_Name; char* CAnimal:GetColor() return m_Co

12、lor; void CAnimal:SetName(char* name) strcpy(m_Name,name); 面向对象程序设计单一继承void CAnimal:SetColor(char* color) strcpy(m_Color,color); CAnimal:CAnimal() m_Name = new char5; m_Color = new char5; CAnimal:CAnimal() delete m_Name; delete m_Color; void CAnimal:Move() printf(Animal is movingn);现在,定义一个CDog类,该类继承

13、于CAnimal类。这样,CDog类就拥有了CAnimal类的所有非私有的数据成员和方法。 面向对象程序设计单一继承class CDog : public CAnimalprotected: char* m_Kind;public: char* GetKind(); void SetKind(char* kind); void yelp(); CDog(); CDog(); void CDog:yelp() printf(Dog can yelp);CDog:CDog() m_Kind = new char10;char* CDog:GetKind() return m_Kind; void

14、CDog:SetKind(char* kind) strcpy(m_Kind,kind);CDog:CDog() delete m_Kind;面向对象程序设计单一继承下面的代码演示了CDog类调用基类的Move方法。int main(int argc, char* argv) CDog dog; dog.SetColor(白色); dog.SetName(狗); dog.Move(); /调用基类的方法 dog.yelp(); /调用自身的方法 return 0;/运行结果:Animal is movingDog can yelp面向对象程序设计protected访问权限类成员有三种访问权限(

15、安全级别)1.public(公有) 本类内可访问,本类内可访问,子类内可访问,子类内可访问,对象可访问对象可访问2.private(私有) 本类内可访问,本类内可访问,子类内不可访问,子类内不可访问,对象不可访问对象不可访问3.protected(保护) 本类内可访问,子类内可访问,对象不可访问本类内可访问,子类内可访问,对象不可访问例例1 1:改写:改写Animal-DogAnimal-Dog例例例例2 2:HomeHome面向对象程序设计3.3 类的高级方法 继承是一种编程技术,可以从现有类中构造一个新类,通过新类来实现面向对象的程序设计。本节将从浅入深地介绍类的继承。 n内联方法n静态数

16、据成员和静态方法n友元类和友元函数nconst方法n运算符重载面向对象程序设计内联方法 在C+中,你可以编写像内联函数一样的内联方法,只需要在方法返回值前添加inline关键字。class CManpublic: void run();inline void CMan:run() printf(man can runn);也可以将方法的定义放在类的声明中,此时该方法自动成为内联方法。class CManpublic: void run()printf(man can runn); /inline 方法;方法run自动成为内联方法。面向对象程序设计静态数据成员和静态方法 在C+中可以定义静态成员

17、数据,所谓静态成员数据是指其数据属于类的,通过类名就可以访问成员数据。在声明类成员数据时,只要在类型前添加static关键字,该成员数据就变为静态成员数据。下面的代码定义了一个CMan类,在该类中定义了一个整型静态成员变量。class CManpublic: static int data;如前所述,静态数据成员不仅可以由对象访问,也可以由类访问。面向对象程序设计下面的代码演示了如何通过类名设置和访问静态成员数据。class CManpublic: static int data;int CMan:data = 1;/初始化静态成员int main(int argc, char* argv)

18、CMan:data = 10; printf(%d,CMan:data); return 0;/运行结果:10面向对象程序设计静态数据成员和静态方法静态成员数据被多个对象所共有,无论定义多少个对象,内存中的静态成员只有一个。因此,当一个对象修改了静态成员数据,另一个对象在访问静态成员数据时,也会发生变化。class CManpublic: static int data; int CMan:data = 1; int main(int argc, char* argv) CMan man1,man2; man1.data = 5; printf(%d,man2.data); printf(n)

19、; man2.data = 10; printf(%d,man1.data); printf(n); return 0;面向对象程序设计静态数据成员和静态方法静态方法与静态成员数据一样,可以由类直接调用。声明静态方法与声明普通方法相似,只是在方法返回值类型前添加static关键字。下面的代码定义了一个CMan类,在该类中定义了一个静态成员变量和一个静态成员方法。class CManpublic: static int data; static int getdata();/静态方法; int CMan:getdata() return data;int CMan:data = 1; int m

20、ain(int argc, char* argv) CMan man1; man1.data = 5; printf(%d,CMan:getdata();/由类名直接调用静态方法 printf(n); return 0;面向对象程序设计类的多态性n发出同样的消息被不同类型的对象接收时导致完发出同样的消息被不同类型的对象接收时导致完全不同的行为。全不同的行为。函数重载(已有知识)函数重载(已有知识)运算符重载运算符重载基于虚函数的多态性基于虚函数的多态性面向对象程序设计运算符重载C+提供了运算符重载的功能,在可以在类中重载某个运算符,这样就可以运算符作用与类对象。运算符重载的格式为:返回值类型

21、operator 运算符 参数列表。例如:int operator +();重载+运算符实现自加操作 例子 p82面向对象程序设计运算符重载CMan CMan:operator +(CMan& one )CMan* temp = new CMan;temp-age = age+one.getage();temp-height = height+one.getheight();return *temp;int main(int argc, char* argv)man3= man1+man2;面向对象程序设计补充:虚函数n虚函数说明方式虚函数说明方式 虚函数是动态联编的基础,它是一种非虚

22、函数是动态联编的基础,它是一种非staticstatic的成员函的成员函数实现动态联编的条件数实现动态联编的条件virtual 类型说明符类型说明符 函数名函数名 ( (参数表参数表) )基基类中有说明的类中有说明的虚函数虚函数调用虚函数操作的只能是对象指针或对象引用,调用虚函数操作的只能是对象指针或对象引用,否则仍为静态联编否则仍为静态联编面向对象程序设计#includeiostream.hclassAnimalpublic:voidcharacter()cout动物特征动物特征: :不同不同.n;virtualvoidfood()cout动物食物动物食物: :不同不同.n;classGir

23、affe:publicAnimalpublic:voidcharacter()cout长颈鹿特征长颈鹿特征: :长颈长颈.n;virtualvoidfood()cout长颈鹿食物长颈鹿食物: :树叶树叶.n;classElephant:publicAnimalpublic:voidcharacter()cout大象特征大象特征: :长鼻子长鼻子.n;virtualvoidfood()coutcharacter();p-food();voidmain()Giraffeg;f(&g);/实参为派生类对象的地址实参为派生类对象的地址Elephante;f(&e);/实参为派生类对象的

24、地址实参为派生类对象的地址观察运行结果观察运行结果 例例 虚函数示例程序虚函数示例程序 面向对象程序设计voidf(Animal&p)/形参为基类形参为基类对象的引用对象的引用p.character();p.food();voidmain()Giraffeg;f(g);/实参为派生类对象实参为派生类对象Elephante;f(e);/实参为派生类对象实参为派生类对象voidf(Animalp)/形参为基类形参为基类对象对象p.character();p.food();voidmain()Giraffeg;f(g);/实参为派生类对象实参为派生类对象Elephante;f(e);/实参为派生类对象实参为派生类对象若将程序的相应部分修改为如下两种形式,再观察运行结果若将程序的相应部分修改为如下两种形式,再观察运行结果面向对象程序设计从上述程序中可见:从上述程序中可见: 只有当虚函数操作的是指向对象的指针或是对象的引用时,只有当虚函数操作的是指向对象的指针或是对象的引用时,对该虚函数调用采取的才是动态联编。对该虚函数调用采取的才是动态联编。虚函数使用说明:虚函数使用说明:派生类中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论