第五章类与对象知识分享

上传人:yuzo****123 文档编号:137886267 上传时间:2020-07-12 格式:PPT 页数:85 大小:702.50KB
返回 下载 相关 举报
第五章类与对象知识分享_第1页
第1页 / 共85页
第五章类与对象知识分享_第2页
第2页 / 共85页
第五章类与对象知识分享_第3页
第3页 / 共85页
第五章类与对象知识分享_第4页
第4页 / 共85页
第五章类与对象知识分享_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《第五章类与对象知识分享》由会员分享,可在线阅读,更多相关《第五章类与对象知识分享(85页珍藏版)》请在金锄头文库上搜索。

1、第五章 类与对象,5.1 类与对象,5.5 运算符的重载,5.4 构造函数和析构函数,5.3 引用,5.2 从面向过程到面向对象,5.10 全局对象及其它,5.9面向对象的程序设计和Windows编程,5.8 结构和联合,5.7 静态成员,5.6 友元,5.1 类与对象,5.1.3对象的创建与使用,5.1.4名字空间域和类域,5.1.1 C+类的定义,5.1.2成员函数的定义,5.1.1 C+类的定义,在C+中,类是一种数据类型。 定义一个类的一般格式为: class 类名 private: 成员表1; public: 成员表2; protected: 成员表3; ;,5.1.1 C+类的定义

2、,例如描述一种商品,在C+中可以这样表述: class CGoods private : char Name21 ; int Amount ; float Price ; float Total_value ; public : void RegisterGoods(char*,int,float) ; void CountTotal(void) ; void GetName(char*) ; int GetAmount(void) ; float GetPrice(void) ; float GetTotal_value(void) ;,5.1.2成员函数的定义,在前面的小结中,只对成员函数

3、作了一个声明,或者讲只给出了函数的原型,并没有对函数进行定义。函数通常在类的说明之后进行,其格式如下: 返回值类型 类名:函数名(参数表) /函数体 其中运算符“:”称为作用域解析运算符(scope resolution operator),它指出该函数是属于哪一个类的成员函数。当然也可以在类的定义中直接定义函数。,5.1.3对象的创建与使用,对象是类的实例(instance),正如在前几章称变量是数据类型的实例一样。声明一种数据类型只是告诉编译系统该数据类型的结构形式,并没有预定内存,或者讲并没有创建了可用来存放数据的变量。类只是一个样板,以此样板可以在内存中开辟出一个个同样结构的实例对象。

4、 创建类的对象可以有两种常用方法。第一种是直接定义类的实例对象: CGoods Car; 这个定义创建了CGoods类的一个对象Car,同时为它分配了属于它自己的存储块,用来存放数据和对这些数据实施操作的成员函数(代码)。与变量定义一样,一个对象只在定义它的域中有效。 第二种是采用动态创建类的对象的方法,将在第七章中学习,当然变量也同样可动态创建。所谓动态指在程序运行时建立对象。而前一种是在编译时(程序运行前)建立。 一个样板可以创造出无数相同的物品来,同样,一个类可以创建出无数同样组成的对象来。,5.1.3对象的创建与使用,有两种方法可存储对象。,5.1.3对象的创建与使用,【例5.1】商品

5、类对象应用实例: #include #include #include /省略了类定义 void main( ) CGoodscar ; char string21 ; intnumber ; float pr ;,5.1.3对象的创建与使用,coutnumberpr ; car.RegisterGoods(string , number , pr) ; car.CountTotal() ; string0=0 ; /字符串string清零 car.GetName(string) ; /string赋值car.Name coutsetw(20)stringsetw(5)car.GetAmoun

6、t() ; /A coutsetw(10)car.GetPrice()setw(20)car.GetTotal_value()endl ; /B ,成员名 Name21 ; Amount ; Price ; Total_value ;,RegisterGoods(char*,int,float) ; CountTotal(void) ; GetName(char*) ; GetAmount(void) ; GetPrice(void) ; GetTotal_value(void) ;,minicar 5 2,10,minicar,5,2,10,5.1.4名字空间域和类域,在C+中支持三种形式的

7、域:局部域(local scope)、名字空间域(namespace scope)和类域(class scope)。 名字空间域是不包含在函数声明、函数定义或类定义内的程序文本部分。换言之,名字空间域可含有函数声明、函数定义或类定义等等 ,而不能相反包含。程序的最外层的名字空间域被称为全局域(global scope),或全局名字空间域(global namespace scope) 程序员也可以利用名字空间定义(namespace definition)来定义用户声明的(user-declared)的名字空间,它们嵌套在全局域内。 用户声明的名字空间定义以关键字namespace开头,后面是

8、名字空间的名字(标识符)。该名字在它被定义的域中必须唯一,不能与其它实体同名,因为用户声明的名字空间可以不连续,分为多段,但它们是同一个名字空间。,5.1.4名字空间域和类域,名字空间域的引入,主要是为了解决全局名字空间污染(global namespace pollution)问题,即防止程序中的全局实体名与C+各种库中声明的全局实体名冲突。 using声明以关键字using开头,后面是被限定修饰的(qualified)名字空间成员名。 例如: namespace cplusplus_primer namespace Matrixlib/名字空间嵌套 class matrix/名字空间类成员

9、matrix . ,5.1.4名字空间域和类域,使用using指示符可以一次性地使库中所有成员都可以直接被使用,而不用限定修饰名。 using cplusplus_primer:Matrixlib:matrix; 等同于: using cplusplus_primer:Matrixlib matrix;,5.1.4名字空间域和类域,使用using指示符可以一次性地使库中所有成员都可以直接被使用,而不用限定修饰名。 using指示符以关键字using开头,后面是关键字namespace,然后是名字空间名。 例如: # include “primer.h” /头文件中定义了cplusplus_pr

10、imer名字空间using namespace cplusplus_primer; /using指示符使cplusplus_primer所有成员都成为可见的 void func(matrix/ func()为cplusplus_primer名字空间中的成员 /cplusplus_primer中所有成员可不加限定修饰地被使用,5.1.4名字空间域和类域,类体也定义了一个域称为类域。在类域中说明的标识符仅在该类的类域内有效。必须加上“类名:”作限定修饰。 类的实体对象中的公有成员也可以在对象之外访问,但必须使用成员访问操作符“.”,对象名+“.”+成员名。 定义类本身的目的就是要实现一个封装性,对

11、外是封闭的,对内是开放的,在程序中并不总是需要用成员访问符之类来引用类成员。多数程序代码本身就在类域中,这些程序可以直接访问类成员。,5.1.4名字空间域和类域,在类域中不仅有数据和函数成员,也可以有类型说明,可以称为类成员,或成员类,其作用域为类域,出了类说明之外无效。例如嵌套类(nested class): class student public : class studentID/成员类、嵌套类 int value ; public : ; private : studentID id ;/嵌套类说明的私有对象 char name20 ; student s1 , s2 ; stude

12、nt:studentID kk ;,5.2从面向过程到面向对象,上世纪六十年代中后期软件危机发生之后,面向过程(procedure-oriented)的结构化程序设计(structured programming,SP)成为主流。结构化程序设计的提出与发展是伴随软件日益庞大和复杂进行的,但是当软件复杂到一定的程度后,结构化程序设计也不能满足需要。当软件规模超过一定的尺度后,采用结构化程序设计,其开发和维护就越来越难控制。其根本的原因就在于面向过程的结构化程序设计的方法与现实世界(包括主观世界和客观世界)往往都不一致,结构化程序设计的思想往往很难贯彻到底。,5.2从面向过程到面向对象,在结构化程

13、序设计中,采用的是“自顶向下,逐步细化(divide and conquer,stepwise refinement)”的思想。它的具体操作方法是模块化,是按功能来分的,所以也称功能块。也就是从一般事物中抽象出来的操作,在C+中称为一个函数,一个函数解决一个问题,即实现一个功能或一个操作。当程序规模和复杂性达到一定程度时不可避免地引入大量的全局变量,这时模块化没法坚持到底。比如一个实时管理系统,当管理的规则发生大的变化,程序的维护往往相当困难,为某一处修改通用的函数往往会影响其它部分,牵一发而动全身。可维护性差成了制约结构化程序设计应用的瓶颈。所以,必须重新进行功能抽象,必须重新建立模块间联系

14、的规则。,5.2从面向过程到面向对象,对象的概念是面向对象技术的核心所在。面向对象技术中的对象就是现实世界中某个具体的物理实体在计算机逻辑中的映射和体现。比如你所拥有的一部移动电话,它是现实世界中的一个实体。它由天线、发射部件、接收部件、显示屏、按键、专用集成电路芯片及外壳组成;它有着其实在的功能,可以打电话,可以发短消息,可以存储、输入和编辑各种个人信息,甚至可以上网。这样一个实体可以在计算机世界中映射为一个计算机可以理解、可以操纵、具有前面所叙述的属性和操作的对象。又如你们所拥有的一辆自行车,它由车架、车轮、脚踏和传动机构、变速机构等组成,它具有代步功能,它可以进行变速骑行,特别要强调的是

15、它有一些特征可以把你的这辆自行车与其他自行车区分开来,其中最重要的是钢印号。这些都可以在面向对象的程序中用对象及其属性和操作模拟出来。,5.2从面向过程到面向对象,实体,抽象类别,现实世界 客观世界,抽象,抽象,实例化,映射,主观世界,图5.3对象、实体与类,现实世界中的实体可以抽象出类别的概念。对应于计算机世界就有一个类(class)的概念,因为类是一个抽象的概念的对应体,所以计算机不给它分配内存,只给对象分配内存。图5.3表达了计算机世界与现实世界之间的对应关系。,5.3引用,在有关函数的学习中,我们知道C+函数中参数的传递方式是传值。在函数域中为参数重新分配内存,而把实参的数值传递到新分

16、配的内存中。它的优点是有效避免函数的副作用,在函数调用中不会无意中修改了实参的值。但如果就是要求改变实参的值,怎么办呢?再者,如果参数是一些简单的数据类型,占据内存不多,重新分配内存问题不大;如果实参是一个复杂的对象,重新分配内存会引起程序执行效率大大下降,怎么办呢?在C+中有一种新的导出型数据类型引用(reference)可以解决上面的难题。引用又称别名(alias)。,5.3引用,引用是一种非常特殊的数据类型,它不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名,也就是C+系统不为引用类型变量分配内存空间。引用主要用于函数之间的数据传递。引用定义的格式为: 类型 newnum是新定义的引用类型变量,它是变量number的别名,内存分配见图5.4。,number称为引用newnum的关联变量。“ double

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号