




已阅读5页,还剩56页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
15.1 概述 15.2 类和对象 15.3 构造函数和析构函数 15.4 继承与派生 第15章 C+的面向对象基础 15.1 概述 C+不仅扩充了C面向过程的功能,而且增加了面向 对象的功能,这就使C+成为能适应面向对象程序 设计的现代大型语言。C+不是简单地对C做了某 些改进,而是在C成功的基础上进行了一场革命。 赋予C以新的生命力。 客观世界中任何一个事物都可以看成一个对象。或 者说,客观世界是由千千万万个对象组成的,它们 之间通过一定的渠道相互联系,如图15.1示意。在 实际生活中,人们往往在一个对象中进行活动,或 者说对象是进行活动的基本单位。作为对象,它应 该至少有两个要素:一是从事活动的主体;二是活 动的内容。要进行活动,或者是事先安排好一个活 动计划,或者由外界临时通知。 图15.1 图15.2 从计算机的角度看,一个对象应该包括两个要素: 一是数据;二是需要进行的操作。对象就是一个包 含数据以及与这些数据有关的操作的集合。图15.2 表示一个对象是由数据和操作代码组成的。 传统的面向过程程序设计是围绕功能进行的,用一 个函数实现一个功能。所有的数据都是公用的,一 个函数可以使用任意一组数据,而一组数据又能被 多个函数所使用(见图15.3)。程序设计者必须考 虑每一个细节,什么时候对什么数据进行操作。当 程序规模较大、数据很多、操作种类繁多时,程序 设计者往往感到难以应付。 图15.3 面向对象程序设计采用新的思路。它面对的是一个 个对象。所有的数据分别属于不同的对象。实际上 ,每一组数据都是有特定的用途的,是某种操作的 对象。把相关的数据和操作放在一起,形成一个整 体,与外界相对分隔。面向对象程序设计方法的一 个重要特点就是“封装性” ,把数据和操作代码封 装在一个对象中。程序设计者的任务包括两个方面 :一是设计对象,即决定把哪些数据和操作封装在 一起;二是在此基础上怎样通知有关对象完成所需 的任务。这时他如同一个总调度,不断地向各个对 象发出命令,让这些对象活动起来,完成自己范围 内的操作。各个对象的操作完成了,整体任务也就 完成了。显然,对一个大型任务来说,面向对象程 序设计方法将是十分有效的,它能大大降低程序设 计人员的工作难度,减少出错机会。 15.2 类 和 对 象 每一个实体都是对象。有一些对象是具有相同的结 构和特性的。在C+中对象的类型称为“类”(class) 。类代表了某一批对象的共性和特征。可以说:类 是对象的抽象,而对象是类的具体实例。正如同结 构体类型和结构体变量的关系一样,人们先声明一 个结构体类型,然后用它去定义结构体变量。同一 个结构体类型可以定义出多个不同的结构体变量。 在C+中也是先声明一个“类”类型,然后用它去定 义若干个同类型的对象。对象就是一个“类”类型的 变量。类是用来定义对象的一种抽象数据类型,或 者说它是产生对象的模板。它的性质和其他数据类 型(如整型、实型、枚举类型、结构体类型)相同 。在一开始时弄清对象和类的关系是十分重要的。 C+对C的改进,最重要的就是增加了“类” 这样一种 数据类型。所以C+开始时被称为“带类的C”。所 有面向对象的语言都提供了这种数据类型。 在C+中怎样声明一个“类”类型呢?其方法和声明 一个结构体类型是相似的。下面是我们已熟悉的声 明一个结构体类型: struct student int num; char name10; char sex ; ; struct student student1,student2; 上面声明了一个名为student的结构体类型并定义了 两个结构体变量student1和student2。可以看到它 只包括数据(变量),没有包括操作。如果希望对 结构体变量中各成员赋值或输出它们的值,需要另 外编写有关的操作语句。结构体变量中各成员在本 作用域中都是“敞开”的,大家都可以用,而且不受 任何限制。这就造成程序的不安全。现在我们声明 一个类: class stud/以class开头 int num; char name10; char sex ; /以上3行是数据成员 void display( ) /这是成员函数 cout #include void main( ) class stud /声明一个类 private: /私有部分 int num; char name10; char sex ; public: /公用部分 stud( ) /定义构造函数,函数名与类名相同 num=10010; /给数据赋初值 strcpy(name,“Wang-li“); sex=F; void display( ) /定义成 员函数,输出对象的数据 cout #include class stud /声明一个类 private: / 私有部分 int num; char name10; char sex ; public: /公用部分 stud(int n,char nam,char s ) /构造函数 num=n; strcpy(name, nam); sex=s; stud( ) /析构函数 void display( ) /成员函数,输出对象的数据 cout #include class stud/声明一个类 private: int num; char name10; char sex ; public: stud(int n,char nam,char s ) ; /对构造函数的原型 声明 stud( ); /对析构函数的原型声明 void display( ) ; /对成员函数display的原型声明 ; studstud(int n,char nam,char s ) /对构造函数 的定义 num=n; strcpy(name, nam); sex=s; studstud( ) /对析构函数的定义 void stud display( ) /对成员函数display的定义 cout #include class stud/声明基类 protected: /保护部分 int num; char name10; char sex ; public: /公用部分 stud(int n, char nam, char s ) /基类构造函数 num=n; strcpy(name, nam); sex=s; stud( ) /基类析构函数 ; class student: public stud /声明公用派生类student private: /派生类的私有数据 int age; char addr30; public: student(int n, char nam,char s , int a, char ad) : stud(n, nam, s) /派生类构造函数 age=a; /在此处只对派生类新增的变量初始化 strcpy(addr, ad); void show( ) cout“num: “numendl; cout“name: “nameendl; cout“sex: “sexendl; cout“age: “ageendl; cout“address: “addrendl; student ( ) /派生类析构函数 ; void main( ) student a(10010,“Wang-li“, f, 19, “115 Beijing Road , Shanghai“); student b(10011,“Zhang-fun“, m , 21, “213 Shanghai Road, Beijing“); a.show( ); /输出第一个学生的数据 b.show( ); /输出第二个学生的数据 请注意派生类构造函数首行的写法: student (int n, char nam, char s , int a, char ad ) : stud(n, nam, s) 其一般形式为 派生类构造函数名(参数表列):基类构造函数名 (参数表列) 派生类构造函数名后面括号内的参数表列包括参数 的类型和参数名。基类构造函数名后面括号内的参 数表列只有参数名而不包括参数类型。从基类的声 明中可以看到基类构造函数stud有3个参数(n, nam, s),派生类构造函数student有5个参数, 前3个是用来传递给基类构造函数的,后面2个(a 和ad)是用来对派生类所增加的变量初始化的。 在main函数中建立对象a时指定了5个实参。它们按 顺序传递给派生类构造函数的形参。然后,派生类 构造函数将前面3个传递给基类构造函数的参数。 见图15.6。 图 15.6 通过stud (n, nam, s) 把3个值再传给基类构造函 数,见图15.7。 stud (n , nam , s) stud(int n, char nam, char s )/这是基类构造函数的首部 图 15.7 在上例中也可以将派生类构造函数在类外面定义,而在 类的声明中只写该函数的声明: student(int n, char nam,char s , int a, char ad) ; 在类的外面定义派生类构造函数: student student (int n, char nam,char s , int a, char ad ): stud(n, nam, s) age=a; strcpy(addr, ad); 注意:在类中对派生类构造函数作声明时,不包括 基类构造函数名和参数表列(即stud(n, nam, s) )。只在定义函数时才将它列出。 在建立一个对象时,由派生类构造函数先调用基类 构造函数,然后再执行派生类构造函数本身。对上 例来说,先初始化num, name, sex,然后再初 始化age和addr。 在派生类对象消失时,先执行派生类析构函数 student( ),再执行其基类析构函数stud( )。 15.4.7 继承在软件开发中的重要意义 继承是面向对象技术的一个重要内容。有了继承, 使软件的重用成为可能。过去,软件人员开发新的 软件,能从已有的软件中直接选用完全符合要求的 部件不多,一般都要进行许多修改才能使用,实际 上有相当部分要重新编写,工作量很大。继承机制 解决了这个问题。将已有的一个类为基础,生成一 些派生类(子类),在子类中保存父类中有用的数 据和操作,去掉(屏蔽掉)不需要的部分。新生成 的子类还可以再生成孙类而且一个子类可以从 多个父类中获得继承(即多继承机制)。编写面向 对象的程序时要把注意力放在实现有用的类上面, 对已有的类加以整理和分类就有可能使这些类能够 被程序设计的许多领域使用。 软件设计者可以最大限度地重用已有软件,对已有 的类根据需要进行剪裁和修改,在此基础上集中精 力编写子类新增加的部分即可。因此有人认为继承 是C+和C的最重要的区别之一。 在本章中我们只是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 鱼泡师傅考试试题及答案
- 颅脑创伤考试题及答案
- 加法减法面试题及答案
- 信访局考试试题及答案
- 2025年广元市消防员招录考试笔试试题(含答案)
- 2025年广安市岳池县农业技术助理岗招聘考试笔试试题(含答案)
- 栓绳安全知识培训内容课件
- 2025年度“全国安全生产月”《安全知识》考试题库(含答案)
- 护理质量试题及答案
- 应急管理知识练习题(附答案)
- 2025年文物保护工程从业资格考试(责任工程师·近现代重要史迹及代表性建筑)历年参考题库含答案详解(5套)
- 社保补助协议书范本
- 2025年调度持证上岗证考试题库
- 小区物业薪酬制度方案(3篇)
- 2025年计算机一级考试题库操作题及答案
- 高血压防治指南
- 2025反洗钱知识试题题库及参考答案
- 高中心理健康教学课件
- 演艺管理专业考试2025年试卷及答案
- 砂型铸造安全培训
- 2025暑期期末教师大会上校长在师德师风会讲话-:师德师风建设是我们一生的修行
评论
0/150
提交评论