C面向对象综述教学讲义_第1页
C面向对象综述教学讲义_第2页
C面向对象综述教学讲义_第3页
C面向对象综述教学讲义_第4页
C面向对象综述教学讲义_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

C面向对象综述教学讲义主要内容面向对象程序设计基础继承性与派生类多态性与虚函数VisualC++6.0应用程序举例一、面向对象程序设计基础一、面向对象程序设计基础C++是C的超集C++不仅仅是一种面向对象的程序设计语言,而且也可以开发面向过程的程序。介绍:类和对象的定义,如何使用对象解决实际问题1.类和对象类和对象的引入,使C++真正成为支持面向对象程序设计的语言。类就像蓝图对象是类的具体实例对象最终要通过类实例化!C++程序中的重点是类而不是函数。类是程序员定义类型。每个类包含数据和操作数据的一组函数。类的数据部分称为数据成员(datamember),类的函数部分称为方法(method,有的时候也称为成员函数)。先声明类,再由类生成其对象。类是建立对象的模板,对象则是类的一个实例。2.从结构体到类C的结构体中可以包含不同的数据类型。在C语言中,数据和操作是分开的!C++语言把结构体进行扩充含有不同的数据类型含有函数类是一种封装了数据和对数据进行操作的自定义的数据类型。3.类的定义形式class类名{private:

私有成员public:

公有成员protected:

保护成员};4.对象的定义对象是类的实例,对象的定义有下面两种情况:声明类时直接定义对象在声明类的右括号“}”后直接列出对象名,并且可以定义多个对象。对象之间用“,”隔开,并且在最后一个对象的后边添加一个“;”声明类之后再定义对象定义形式与一般变量定义一样。其基本形式为:类名对象;5.对象的使用对象的定义完成以后就可以在程序中使用该对象。其类型为公有(public),在类的外部都可以通过对象进行访问。访问的形式如下:对象名.数据成员对象名.函数成员(实参列表)注意:对于类的包含成员和私有成员,类的对象并不能直接访问。因此一般情况下都会

利用一定的接口对类的包含成员和私有成员进行访问。参看书上示例14.1、14.26.对象的初始化、构造函数和析构函数对象也被称为类变量。作为变量,对象可以为其数据成员赋初值。对象的初始化有多种不同的方式。如果一个类只有公共数据成员,那么其对象的初始化与一般变量、结构变量或数组的初始化没有什么区别,在生成对象后设置其数值。在C++中,对象中数据成员的初始化最常用的方法是在构造函数中完成。7.构造函数构造函数是一种特殊的成员函数,是与类名同名的成员函数。构造函数在每次生成对象(实例化,使用new关键字)时自动调用,进行一些初始化工作。构造函数可以重载,提供初始化对象的不同方法。8.构造函数性质构造函数和类的名字相同。构造函数不具有返回值。定义对象时,系统根据提供的参数自动调用构造函数。构造函数是公有函数,但它不可以被显式调用。9.程序讲解示例14.3示例14.4程序中如果定义了构造函数,无论它是否带有参数,系统不会再添加构造函数。因此,如果此时的构造函数带有参数,并且没有指定默认值,那么在创建对象时必须指定参数。10.析构函数析构函数也是一种特殊的成员函数,它执行和构造函数相反的工作。析构的特殊性质:析构函数名称与类名相同,但前面加一个“~”。一个类中只有一个析构函数,并且该函数不带任何参数。当撤销对象时编译系统自动调用析构函数。若程序员没有定义析构函数,编译系统会生成析构函数。11.构造函数和析构函数的调用机制构造函数和析构函数都是自动调用的。构造函数因为可以重载,可以有多个,通过参数的不同而确定调用哪一个;而析构函数只有一个。构造函数和析构函数的调用次序取决于执行过程进入和离开实例化对象范围的顺序。当有多个对象被嵌套使用的时候,一般来说,析构函数的调用次序与构造函数相反。12.类的包含和子对象的初始化一个类的对象可以是另一个类的成员,称为类的包含(有时也称为复合),作为成员的对象称为子对象。例如:classA{…}classB{ Aa;//子对象… public;…};其中,类A的对象a是B的一个成员,对象a称为B的成员对象或子对象,类B和类A形成包含关系。13.对象的使用类是一种数据类型,是对象类型,对象是一种变量,是类变量。各种类型变量的使用方法同样适用于对象,对象指针对象数组对象作为函数的参数14.对象的作用域与生命周期按照作用域和生命周期,可将对象分为如下三类:全局对象作用域最大,有文件级和程序级作用域;生命期最长。局部对象函数的形参以及函数内部声明的对象都是局部对象。局部对象的作用域最小,生命周期是函数的执行过程。静态对象C++使用static声明静态变量。静态对象的作用域和生命期介于全局对象和局部对象之间。其作用域为块级、函数级或文件级。15.静态成员静态成员的提出是为了解决数据共享的问题。静态数据成员的使用方法:静态数据成员在定义或说明时前面加关键字static。静态数据成员初始化的格式如下:<数据类型><类名>::<静态数据成员名>=<值>16.静态数据成员的应用#include<iostream.h>classMyclass{ public: Myclass(inta,intb,intc); voidGetNumber(); voidGetSum(); private: intA,B,C; staticintSum;};intMyclass::Sum=0;Myclass::Myclass(inta,intb,intc){ A=a; B=b; C=c; Sum+=A+B+C;}voidMyclass::GetNumber(){ cout<<"Number="<<A<<","<<B<<","<<C<<endl;}voidMyclass::GetSum(){ cout<<"Sum="<<Sum<<endl;}voidmain(){ MyclassM(3,7,10),N(14,9,11); M.GetNumber(); N.GetNumber(); M.GetSum(); N.GetSum();}17.友元友元:需要在类的外部访问类的私有成员。类的友元函数在类范围之外定义,但有权访问类私有(private)成员。函数或整个类都可以声明为另一个类的友元。18.友元的应用友元函数:在类的定义中声明友元函数时,需要在函数名前面加上friend。友元函数可以定义在类的内部,也可以在类的外部定义。友元成员一个类的成员函数也可以作为另一个类的友元。这样的函数不仅可以访问本类的所有成员,还可以访问其友元类的所有成员。友元类在类的声明中加入语句friend类名。例如:要将类ClassB声明为ClassA的友元,在ClassA的定义中应如下声明:friendclassClassB;二、继承性与派生类1.继承概述继承对面向对象编程至关重要。继承在原有类的基础上定义出新的类,新类不仅拥有新定义的数据成员和函数成员,而且自动继承并拥有原有类的数据成员和函数成员。2.基类与派生类基类原有的类称为基类(或父类)派生类新类称为派生类(或子类)。单一继承派生类只有一个基类。多重继承派生类常常是从多个基类派生出来的,这些基类之间可能毫无关系。单一继承比较简单,多重继承更复杂,3.单一继承单一继承从一个基类中派生出的继承称为单一继承。单一继承派生类的定义形式如下:class派生类名:继承方式基类名{ 派生类新定义的成员};派生类名是由基类派生出来的派生类的名字。基类即可能是派生类的直接基类,也可能是派生类的间接基类。在定义派生类时,派生类的首部要显示的列出直接基类。间接基类不是显示的列在派生类的首部,而是沿着类的多个层次逐次向上继承。4.继承方式5.多重继承一个类也可以从多个基类派生而来,这种派生称之为多重继承。多重继承的定义形式如下:class派生类名:继承方式1基类名1,继承方式2基类名2,...,继承方式n基类名n{ 派生类新定义的成员};在多重继承定义中,必须给每个基类分别指定继承方式,继承方式和基类成员的访问权限共同决定基类成员在派生类中的访问权限,其规则与单一继承相同。6.多重继承中的歧义使用多重继承会影响到类中成员的查找。当派生类定位一个成员的时候,所有的直接基类会被同时查找,如果从两个或多个基类中继承了同名的成员,则增加了歧义引用的可能性。解决方法:在程序层次上,解决成员歧义的方案是用类操作符显示限定修饰“期望被调用的成员属于哪个实例”。类设计者完成参看示例15.77.继承中的一个问题当派生类D的两个基类B和C都从一个公共基类A派生而来,创建类D的对象时会创建两个类A的相同副本,即此时每一个D的对象都会有含有两个A的对象。效率上存储两个A对象的副本,浪费了存储空间;D对象中存在两个A对象会引起歧义。任何未经修饰的访问D中的成员A对象都会产生编译时刻的错误:到底访问哪个呢?如果B和C对其A子对象的初始化有不同的时候,又会如何?8.虚拟继承虚拟继承只有一个共享的基类子对象被继承无论该基类在继承层次中出现多少次。这个共享的基类被称之为“虚基类”。9.虚基类对于上面的例子,声明派生类B和类C时,将公共基类A声明为虚基类,由类B和类C派生出来的类D在创建对象时将只建立公共基类A的一个副本。在声明派生类时,虚基类的声明形式如下:class派生类名:virtual继承方式基类名{ 派生类新定义的成员};关键字virtual申明基类为虚基类,多重继承时,每一个虚基类都需要一个关键字virtual。三、多态性与虚函数1.多态性与虚函数多态性是指同一对象接受相同的消息时产生不同行为,即对应相同的函数名却执行不同的函数体。在C++中,多态性主要通过两类三种方式实现。第一类:静态多态(静态联编的多态、编译时多态)有两种实现方式:运算符重载函数重载第二类:动态多态(动态联编的多态、运行时多态)有一种实现方式:虚函数2.运算符重载为已有的运算符定义新的功能,使得同一个运算符作用于不同类型数据时产生不同的行为。为自定义的数据类型定义运算符。通过定义成员函数或友元函数来实现。3.运算符重载的几个概念可以重载的运算符多数运算符都可以重载,只有以下几个运算不可以重载:.圆点运算符?:三目运算符.*成员指针选择Sizeof测试数据长度运算符::作用域运算符typeof测试数据类型运算符运算符重载的限制原有特性不变操作数个数不变;优先级不变;结合性不变;语义不变注意:通常不随意改变重载运算符的功能含义。定义运算符重载的函数时不能设置默认值。只能使用C++已有的运算符,不可自己创造新的运算符。4.运算符重载实现运算符重载为成员函数的定义形式:<类型>operator<运算符>(<参数表>){ <函数体>}运算符重载为友元函数的定义形式:friend<类型>operator<运算符>(<参数表>){ <函数体>}5.静态联编和动态联编将程序中的函数调用解释为执行特定的函数体被称为联编(binding)。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。静态联编:联编工作出现在编译连接阶段,在编译时进行。动态联编:在程序运行时进行联编。如何来确定是静态联编还是动态联编呢?C++规定动态联编是在虚函数的支持下实现的。6.静态联编静态联编的函数重载主要有两种方式:在同一个类中重载函数,基类成员函数在派生类中重载。7.函数重载函数重载(functionoverloading)C++允许定义多个同名函数,只要这些函数有不同的参数列表(至少有不同类型的参数)。在静态联编的时候,C++通过签名进行区别。签名是函数名和参数类型的组合。注意:全局函数和类的成员函数同名不算重载,因为函数的作用域不同。8.成员的重载成员函数被重载的特征:相同范围(在同一个类中);函数名字相同;参数不同(个数、类型、顺序);virtual关键字可有可无。classA{ public: //…… show(int,int); show(double); show(double,int);}//重载函数参数类型和个数不同9.基类成员函数在派生类中重载在派生类中重载基类中的成员函数,实质还是

温馨提示

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

评论

0/150

提交评论