《类与对象(本教案改变了教学次序)》由会员分享,可在线阅读,更多相关《类与对象(本教案改变了教学次序)(110页珍藏版)》请在金锄头文库上搜索。
1、第五章 类与对象(本教案改变了教学次序)从本章起将进入面向对象程序设计学习的实质阶段。 封装(Encapsulation)是面向对象程序设计最 基本的特性,把数据(属性)和函数(操作)合成一 个整体,这在计算机世界中是用类与对象实现的。本 章将引入C+的类(class)和对象(object)的概念 ,建立“函数也可以是数据类型的成员”的思想。本 章中用运算符重载来体现类和对象封装的实用性和重 要性。 学习程序设计(编制软件)的目的是要解决实际 问题,只有具备了从实际问题中抽象出类和对象的能 力,才能说初步掌握了面向对象的程序设计的方法。 第五章 类与对象5.1 类与对象 5.5 运算符的重载
2、5.4 构造函数和析构函数(下) 5.3 引用 5.2 从面向过程到面向对象 5.9 全局对象与类接口 5.10面向对象的程序设计和Windows编程 5.8 结构和联合 5.7 静态成员 5.6 友元 5.11 对象与类的识别 5.4 构造函数和析构函数(上)5.1 类与对象 5.1.3对象的创建与使用 5.1.4名字空间域和类域 5.1.1 C+类的定义 5.1.2 成员函数的定义 5.1.1 C+类的定义 在C+中,类是一种数据类型。数组和枚举类型是由用户自己 定义,自己按规则构造出来的,但其基本组成单位(数据成员 )都是同一种数据类型。然而客观事物是复杂的,要描述它必 须从多方面进行,
3、也就是用不同的数据类型来描述不同的方面 。如商场中的商品可以这样描述:商品名称(用字符串描述),该商品数量(用整型数描述 ),该商品单价(用浮点数描述),该商品总价(用浮点数描 述)。 这里用了属于三种不同数据类型的四个数据成员(data member)来描述一种商品。5.1.1 C+类的定义在C+中可以这样表述: class CGoodspublic :char Name21 ; /对于中文可用wchar_t name11int Amount ;float Price ;float Total_value ; ; /最后的分号不可少,这是一条说明语句 上面的表述中,关键字class是数据类型
4、说明符,指出下 面说明的是类。标识符CGoods是商品这个类的类型名。 花括号中是构成类体的一系列的成员,关键字public是 一种访问限定符,表示其后所列为公共成员,就是说可 以在外部对这些成员进行访问。5.1.1 C+类的定义访问限定符(access specifier)有三种: public(公共的),private(私有的)和 protected(保护的),其中后两种说明的成员是 不能从外部进行访问的。每种说明符可在类体中使 用多次。它们的作用域是从该说明符出现开始到下 一个说明符之前或类体结束之前结束。如果在类体起始点无访问说明符,系统默认定 义为私有(private)。访问说明符p
5、rivate(私有的)和protected(保 护的)体现了类具有封装性(Encapsulation)。5.1.1 C+类的定义定义一个类的一般格式为: class 类名 private:成员表1;public:成员表2;protected:成员表3; ; /最后的分号不可少;注意:所有说明都有分号 其中“class 类名”称为类头(class head)。花括号中的部分 称为类体(class body),类体中定义了类成员表(class member list)。 类定义的更关键部分是对数据成员的操作。这可以用函数来完 成。 5.1.1 C+类的定义这样描述一种商品的完整方式如下: clas
6、s 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.1 C+类的定
7、义这样在类中引进了成员函数(member function)或函数 成员,也就是函数也成了数据(类)中的一员。类把数据(事物 的属性)和函数(事物的行为操作)封装为一个整体。 还应注意到:四个数据成员被说明成私有的,而六个函数成员 被说明成公有的;这就是说如果从外部对四个数据成员进行 操作的话,只能通过六个公有函数来完成,数据受到了良好的保 护,不易受副作用的影响。公有函数集定义了类的接口( interface)。类是一种数据类型,定义时系统并不为类分配存储空间,所 以不能对类的数据成员初始化。当然类中的任何数据成员也 不能使用关键字extern、auto或register限定其存储类型。成员
8、函数可以直接使用类定义中的任一成员,可以处理数据 成员,也可调用函数成员。 5.1.2成员函数的定义 在前面的小结中,只对成员函数作了一个声 明,或者讲只给出了函数的原型,并没有对函 数进行定义。函数定义通常在类的说明之后进 行,其格式如下: 返回值类型 类名:函数名(参数表)/函数体 其中运算符“:”称为作用域解析运算符(scope resolution operator),它指出该函数是属于 哪一个类的成员函数。当然也可以在类的定义 中直接定义函数。但系统处理方法不一样。 5.1.2成员函数的定义类CGoods的函数可以如下定义: void CGoods:RegisterGoods(cha
9、r* name , int amount , float price)/char*是指向字符的指针类型说明,name现可理解为字符串 strcpy(Name , name) ; /字符串拷贝函数 Amount=amount ; Price=price ; void CGoods:CountTotal(void)Total_value = Price*Amount; void CGoods:GetName(char* name) strcpy(name , Name); int CGoods:GetAmount(void)return(Amount) ; float CGoods:GetPric
10、e(void)return(Price) ; float CGoods:GetTotal_value(void)return(Total_value) ;对象是类的实例(instance),正如在前几章称变量是数据 类型的实例一样。声明一种数据类型只是告诉编译系统该数据 类型的结构形式,并没有预定内存,或者讲并没有创建了可用 来存放数据的变量。类只是一个样板,以此样板可以在内存中 开辟出一个个同样结构的实例对象。创建类的对象可以有两种常用方法。第一种是直接定义类 的实例对象: CGoods Car; 这个定义创建了CGoods类的一个对象Car,同时为它分配了属 于它自己的存储块,用来存放数据
11、和对这些数据实施操作的成 员函数(代码)。与变量定义一样,一个对象只在定义它的域 中有效。第二种是采用动态创建类的对象的方法,将在第七章中学 习。所谓动态指在程序运行时建立对象。而前一种是在编译时 (程序运行前)建立。5.1.3 对象的创建与使用有两种方法可存储对象。 数据区代码区对象1数据区代码区对象数据区代码区对象 图5.1 各对象完全独立地安排内存的方案数据区对象1数据区对象 数据区对象 图5.2 各对象的代码区共用的方案公共代码区图5.1是系统为每一个对象分配了全套的内存,包括安放成员数 据的数据区和安放成员函数的代码区。但区别同一个类的各个 不同的对象的属性是由数据成员决定的,不同对
12、象的数据成员 的内容是不一样的;而行为(操作)是用函数来描述的,这些 操作的代码对所有的对象都是一样的。图5.2仅为每个对象分配 一个数据区,代码区(放成员函数的区域)为各对象类共用。 图5.1对应的是在类说明中定义函数,而图5.2对应的是在类说 明外部定义函数 。5.1.3对象的创建与使用下例给出对象使用的规则 【例5.1】商品类对象应用实例: #include #include #include /省略了类定义void main( ) CGoodscar ; char string21 ; intnumber ; float pr ;如果通过使用关键字inline,则系统也会自动采用内联扩
13、展方 法实现,这时每个对象都有该函数一份独立的拷贝。如 RegisterGoods()函数可定义为: inline void CGoods:RegisterGoods(char* name , int amount , float price) strcpy(Name,name) ; Amount=amount ; Price=price ; 则每个对象都有RegisterGoods()函数一份独立的拷贝。成员名 Name21 ; Amount ; Price ; Total_value ;10minicar5210minicar 5 2string21 number Prminicar 5
14、2minicarcoutnumberpr ; car.RegisterGoods(string , number , pr) ; car.CountTotal() ; string0=0 ; /字符串string清零 car.GetName(string) ; /string赋值car.Name coutvoid swap(double temp=d1 ; d1=d2 ; d2=temp ; void main(void)double x , y ;coutxy ;swap(x,y) ;cout double temp; double fsqr1(double a)temp=a*a ; ret
15、urn temp; double return temp; void main()double x=fsqr1(5.5);/第一种情况double y=fsqr2(5.5);/第二种情况cout int else if(grade=60) return typeB; else return typeC; void main( ) int typeA=0,typeB=0,typeC=0 ; int student=9 ; int array9=90 , 75 , 83 , 66 , 58 , 40 , 80 , 85 , 71 ; for (int i=0 ; i #include “rect.h” / 构造函数,带缺省参数,缺省值为全0,在声明中指定 Rectangle:Rectangle(int l , int t, int r, int b) left = l; top = t;right = r; bottom = b; void Rectangle:Assign(int l, int t, int r, int b)left = l; top = t;right = r; bottom = b; void Rectangle:Show()coutRectangle(left, top, right