C的面向对象编程.ppt_第1页
C的面向对象编程.ppt_第2页
C的面向对象编程.ppt_第3页
C的面向对象编程.ppt_第4页
C的面向对象编程.ppt_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

第4章 C+的面向对象编程,C+是面向对象的程序设计语言,类是其实现面向对象的工具。类是面向对象程序设计(OOP)实现信息封装的基础,是C+语言最重要的特性。类是进行数据封装和数据保护的工具。本章主要知识点为: 类和对象的基本概念; 友元; 派生类; 继承与多重继承; 多态; 函数重载和运算符重载; 虚函数。,4.1 类和对象的基本概念,类是现实事物共有特征的抽象,而对象是类的具体实例。在面向对象的程序设计中,总是先声明类,再由类生成其对象。类是建立对象的模板,对象则是类的一个实例。,4.1.1 从结构到类,在C语言中有一种自定义的数据类型:结构体。结构体中可以函数不同的数据类型。C+语言把结构体进行扩充,它不仅可以含有不同的数据类型,而且可以含有函数。在C+中结构体的定义形式如下: struct 结构体名 成员表列 变量名表列; struct是定义结构体的关键字,后面的结构体名是结构体的名称。在结构体中可以定义一个或多个成员变量或这函数。当然也可以不定义变量,此时称为空结构体。变量名表列是在定义结构体时,同时定义结构体变量。也可以不定义变量,在后面用到的地方在定义结构体变量。需要注意的是结构体右括号的变量名表列后面需要添加一个“;”。,4.1.2 成员函数的定义,类中含有两种成分:数据成员和函数成员。函数成员又称为成员函数。成员函数的定义有两种方式。 1方式一 2方式二,4.1.3 对象的定义与使用,对象是类的具体实例,定义好类以后必须去定义类的对象才可以真正的去实现类的功能。一般情况下对象的定义有下面两种情况。 1声明类时直接定义对象 2声明类之后再定义对象,4.1.4 对象的作用域,类是面向对象的体现,它具有一定的数据保护功能。类的作用域就是类的保护功能的机制。类的作用域是指类的声明部分中的一对花括号所形成的作用域。一个类的所有成员都在该类的作用域内。在上面的例子中已经看到类的私有成员变量不可以在类的外部所访问,因此需要定义一个公有成员函数间接的访问类的私有成员。,4.2 构造函数和析构函数,类是一种用户自定义的数据类型。定义一个类的对象时,编译程序需要为对象分配存储空间,进行必要的初始化工作。在C+中类的构造函数就是去实现这部分功能。,4.2.1 构造函数,构造函数是一种特殊的成员函数,它主要进行一些初始化工作。构造函数有一些基本性质: (1)构造函数和类的名字相同。 (2)构造函数不具有返回值。 (3)定义对象时,系统自动调用构造函数。 (4)构造函数是公有函数,但它不可以被显示调用。,4.2.2 默认参数的构造函数,对于有参数的构造函数,在定义对象时必须给构造函数传递参数。实际情况中,虽然有些构造函数有参数,但其参数是不变的,这就是默认参数的构造函数。此时构造函数的形式如下: 类名(函数名)(参数1=默认值,参数2=默认值,) 构造函数中的参数与普通函数的参数是一样的,所谓的默认参数即为该参数设置一个默认的取值。可以为全部或者部分参数设置默认值。,4.2.3 析构函数,析构函数也是一种特殊的成员函数,它执行和构造函数相反的工作。析构的特殊性质如下: (1)析构函数名称与类名相同,但前面加一个“”。 (2)一个类中只有一个析构函数,并且该函数不带任何参数。 (3)当撤销对象时编译系统自动调用析构函数。 (4)若程序员没有定义析构函数,编译系统会生成析构函数。,4.2.4 重载构造函数与拷贝构造函数,C+允许重载构造函数,所谓的重载构造函数是指允许在类中有多个构造函数。当然这些构造函数肯定是有区别的。各个构造函数必须拥有不同的参数个数或者参数类型。,4.3 友元,类的主要特点是是数据隐藏,即类的私有成员只可以被类的内部使用,但是有的时候需要在类的外部访问类的私有成员,为此C+利用了一种新的机制友元。,4.3.1 友元函数,友元函数不是类的成员函数,而是独立于当前类的外部函数,但它可以访问该类的所有成员。在类的定义中声明友元函数时,需要在函数名前面加上friend。友元函数可以定义在类的内部,也可以在类的外部定义。 注意:友元在类的封装性中打了个孔,使封装性的强度下降,程序中如非必要,应尽量减少友元的使用。,4.3.2 友元成员,除了一般的函数可以作为类的友元外,一个类的成员函数也可以作为另一个类的友元。这样的函数不仅可以访问本类的所有成员,还可以访问其友元类的所有成员。需要注意的是当在一个类中的某个成员函数定义为另一个类的友元函数时需要首先定义此类。例如要定义类A的某个函数为类B的友元函数,那么需要先定义类B,然后再进行类A的成员函数与B友元的定义。,4.3.3 友元类,不仅函数可以作为一个类的友元,一个类也可以作为另一个类的友元。定义方法是在类的声明中加入语句friend类名。,4.4 派生类,继承是面向对象程序设计的一个重要特性,它允许在现有类的基础上创建新的类,可以继承原有类数据和函数,同时可以添加新的成员。继承特性增加了代码的重复利用率,加快开发效率。通过继承已有的一个或多个类产生一个新类的过程称为派生。通过派生可以创建一种新的类,所创建的新类称为派生类。,4.4.1 派生类的引出,现实世界中,继承的概念十分广泛。人们认识世界就是一个层次结构。越靠近上层就表示越为普遍的概念,例如下面的一个层次结构: 在类中,继承的概念就是从父辈得到其属性。即产生的新类就是原有类的派生。原有类就是派生类的基类。派生类的声明形式如下: class 类名:继承方式 基类 ,4.4.2 基类成员在派生类中访问属性,派生类继承基类的方式有三种情况,那么继承过来的成员其属性如何呢?下面给出三种继承方式下的基类成员在派生类中的访问属性。,4.4.3 派生类对基类成员的访问规则,派生类对基类成员的访问形式包括内部访问和对象访问两种方式。下面对三种继承方式下的访问规则分别进行介绍。 1私有继承 2保护继承 3公有继承,4.5 派生类的构造函数与析构函数,派生类继承了基类的成员,实现了代码的重复利用,但是继承的目的更主要的是功能的扩充。基类的构造函数和析构函数不能被继承。如果在派生类中需要对新增加的成员进行初始化,则需要加入派生类的构造函数。同样派生类也需要添加虚构函数来实现一些结束工作。,4.5.1 派生类构造函数和析构函数的执行顺序,当创建对象时,编译系统会自动调用构造函数。当撤销对象时,编译系统会自动调用析构函数。当创建派生类的对象时,首先执行基类的构造函数,然后执行派生类的构造函数。当撤销对象时,则先执行派生类的析构函数,然后再执行基类的析构函数。,4.5.2 派生类构造函数和析构函数的构造规则,派生类不能继承基类的构造函数,如果基类中含有带参数的构造函数,则派生类中必须定义构造函数,用以向基类传递参数。派生类的构造函数的定义必须包含基类的参数,其定义的一半格式为: 派生类名(全部参数列表):基类名(参数列表) 派生类的析构函数和基类的析构函数关系不大,程序中可以分别进行设计。,4.6 继承与多重继承,继承使得派生类既保持了基类的特性,又可以增加新的功能。如果一个类,其属性可以从多个基类中获得,这就需要多重继承的概念。,4.6.1 继承和多重继承,继承是一个类从一个基类中派生,多重继承则是指一个类从多个基类进行派生。现在有一个类A和类B,现在要设计一个类C,它需要既继承类A的特性,又继承类B的特性,那么类C就需要多成继承类A和类B。,4.6.2 多重继承的声明,在C+中,类的多重继承与单继承的声明相似,其一般形式是: class 派生类名:继承方式1 基类1,继承方式n 基类n 在多重继承中,派生类的构造函数要进行基类的初始化工作,因此如果任何一个基类的构造函数含有参数,那么派生类必须添加构造函数。构造函数的执行顺序是先执行基类的构造函数。在执行派生类的构造函数,同一层次的基类的执行顺序与声明时的顺序有关。相反析构函数的执行与构函数的顺序相反。,4.6.3 虚基类,如果一个派生类的基类是从一个共同的基类派生出来的,那么派生类的对象就是从底层基类的间接派生,它会出现多个基类的拷贝,程序中如何进行分辨呢?一种方法是利用作用域运算符,即在访问基类的成员时明确指出要访问的是哪一个基类的数据成员。另一种方法是利用虚基类。虚基类是让基类只有一个拷贝,程序中的访问就不会出现访问的不确定性。虚基类在派生类中声明,其格式为: class 派生类名:virtual 继承方式 基类 虚基类的声明与普通的继承形式相同,只不过要在继承方式的前面添加关键字:“virtual”。当使用虚基类时,基类只有一个拷贝,程序中的访问具有确定性。,4.7 多态的基本概念,程序的多态性是指不同的对象收到相同的消息而作出不同的动作。多态性包括运行时的多态性和编译时的多态性。编译时的多态性是指编译时的多态,通过函数重载和运算符重载来实现。运行时的多态则通过继承和虚函数来实现。 1编译时的多态性 2运行时的多态性,4.8 函数重载和运算符重载,函数重载和运算符重载可以实现编译时的多态性,从而可以动态的决定程序的动作。函数重载可以使程序设计更加灵活。运算符重载利用运算符函数来实现。,4.8.1 函数重载,派生类可以改写基类的成员函数,从而实现新的功能。这就是函数重载。函数重载后,程序员使用派生类的对象可以访问基类或者是派生类的成员函数。函数重载提高了程序设计的灵活性。,4.8.2 运算符重载,在C+中,除了对、可以对函数进行重载外,还可以对运算符进行重载。运算符的重载通过创建运算符函数operator来实现。运算符重载定义了重载的运算符的操作。函数ooperator的操作对象是一个类,同时operator可以是这个类的成员函数,可以是类的友元函数。 运算符重载在实际运用中有十分重要的意义,例如复数的四则运算就可以借助运算符重载来实现。运算符重载包括两种形式,一是重载为类的成员函数,一是重载为类的友元函数。其形式如下: 1重载为类的成员函数: 函数类型 operator 运算符(参数表) 2重载为友元函数: friend 函数类型 operator 运算符(参数表) ,4.9 虚函数,虚函数是重载的另一种表现形式,它提供了一种动态机制,使程序运行更加灵活。一个基类的指针可以指向派生类的对象,但是利用基类指针调用类的函数时仍然调用的是基类的成员函数。例如下面的例子。,4.10 本章实例类的使用,上面介绍了继承、多态和重载的基本概念和使用方法。C+作为面向对象的程序设计语言,继承、多态和重载的出现使C+面向对象的特点体现的更加明确。本节给出几个例子。 【示例4.26】创建复数类,利用运算符重载,实现其加法和减法。,4.11 小结,继承、封装和多态是面向对象程序设计的三大特性。本章详细介绍了C+的面向对象程序设计理论。介绍了类的基本概念和基本操作。对派生类和基类的构造函数和析构函数的执行顺序进行分析。

温馨提示

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

评论

0/150

提交评论