资源预览内容
第1页 / 共63页
第2页 / 共63页
第3页 / 共63页
第4页 / 共63页
第5页 / 共63页
第6页 / 共63页
第7页 / 共63页
第8页 / 共63页
第9页 / 共63页
第10页 / 共63页
亲,该文档总共63页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
程序设计是计算机学科的程序设计是计算机学科的 核心和灵魂核心和灵魂程序设计基础第五章第五章 类与对象类与对象1o类的作用类的作用o 类界面与类实现类界面与类实现o 类成员的访问控制类成员的访问控制o 对象的创建对象的创建o 静态数据成员静态数据成员o 构造函数与析构函数构造函数与析构函数o 成员对象的初始化成员对象的初始化25.1 5.1 类的引入类的引入实体:从属性与行为两个方面刻画一个实体n现实世界实体例:银行账户、学生、传感器、n思维世界实体例:复数、矩阵、堆栈、类:描述实体的抽象概念对象:对应于一个个具体实体35.1 5.1 类的引入类的引入5.1.1 循环计数器循环计数器循环计数:003590、112数据定义:min_val、max_val、current函数设计:increment()、decrement()、set_mode()、get_value()、set_value45.1 5.1 类的引入类的引入5.1.1 循环计数器循环计数器保护内部数据:staticintmin_val;staticintmax_val;staticintcurrent;信息隐藏n将一个模块的内部数据或操作隐藏起来,其他模块只能通过该模块提供的公开操作来访问该模块n信息隐藏由封装机制来实现。在在C语言中用文件作为模块来实现语言中用文件作为模块来实现55.1 5.1 类的引入类的引入5.1.1 循环计数器循环计数器用文件作为模块来实现封装CIRNUM1.Hpp/循环计数器头文件CIRNUM1.CPP/实现循环计数器65.1 5.1 类的引入类的引入5.1.2 循环计数器的讨论循环计数器的讨论用文件作为循环计数器模块的好处好处:头文件作为模块界面,保护内部数据;应用程序不关心模块内部实现细节;便于模块设计者修改实现方法和扩展新功能。不足不足:不够抽象,如定义三个记录角度、月份和时间的计数器;函数名冲突问题;模块修改必须重新编译。增增加加程程序序可可靠靠性性和和可可重重用用性性75.1 5.1 类的引入类的引入5.1.3 类作为构造程序的基本单位类作为构造程序的基本单位类(class):构造程序的基本单位,将数据以及这些数据上的操作(函数)封装在一起。类成员(member):数据与函数C+类的作用:数据封装类型定义85.2 5.2 类的定义类的定义5.2.1 类声明类声明类是对一群具有相同属性、表现相同行为的对象的描述,类声明的一般形式:class类名public:公有数据和函数private:私有数据和函数;类中定义的数据(变量)称为数据成员类中定义的函数(行为操作)称为成员函数95.2 5.2 类的定义类的定义5.2.1 类声明类声明例:循环计数器类classCIRCULAR_NUMBERSpublic:voidset_mode(intmin,intmax)/设置循环计数器的上、下限min_val=min;max_val=max;return;voidset_value(intvalue)/设置循环计数器的当前值current=value;return;intget_value()/查询循环计数器的当前值returncurrent;voidincrement()/循环计数器加一intmode=max_valmin_val+1;current=(currentmin_val)+1)%mode+min_val;return;voiddecrement()/循环计数器减一intmode=max_valmin_val+1;current=(currentmin_val)-1+mode)%mode+min_val;return;private:intmin_val;/最小值intmax_val;/最大值intcurrent;/当前值;105.2 5.2 类的定义类的定义5.2.1 类声明类声明说明:o类的数据成员允许是任何数据类型,但不能是本类类型的。正在定义的类名只可以以指针形式声明自己类中的数据成员classLinkclassLinkLinkmember;Link*member;115.2 5.2 类的定义类的定义5.2.1 类声明类声明o类中的数据成员不允许使用初值表达式classCIRCULAR_NUMBERSprivate:intmin_val;intmax_val;类中的数据成员不允许使用auto,register,extern修饰,但允许使用static修饰,得到静态数据成员:供该类的所有对象公用=0=359125.2 5.2 类的定义类的定义5.2.1 类声明类声明o在类中 const 的使用I.const修饰数据成员:用于声明类中的一个常量数据成员。由于类的数据成员在声明时不能有初值表达式,因此类的常量数据成员在声明时不能指定常量值。classCconstdoublePI;II.const修饰成员函数:常量成员函数常量成员函数,常量成员函数中不允许修改本类数据成员的值。classCintget_value()const;135.2 5.2 类的定义类的定义5.2.2 类成员的访问控制类成员的访问控制 指明成员的可访问性o私有段:由private标记的段段内的数据成员和成员函数称为私有成员,仅能由该类中的成员函数来访问,即仅可在成员函数定义中使用私有成员的名字。o公有段:由public标记的段段内的数据成员和成员函数称为公有成员,为该类提供与外部世界的接口界面,即可在类内也可在类外访问。o类中每一个成员都有访问控制属性,若没有明确指明,成员的访问控制方式缺省为private。145.2 5.2 类的定义类的定义5.2.3 类界面与类实现类界面与类实现o类的成员函数可以在类内定义,也可以在类外定义。o类界面:头文件*.hpp声明类,包括类的所有数据成员,以及成员函数的原型/程序:程序:CIRNUM3.hpp /功能:循环计数器头文件功能:循环计数器头文件 class CIRCULAR_NUMBERS public: void set_mode(int min, int max);/ 设置循环计数器的上、下限设置循环计数器的上、下限 void set_value(int value) / 设置循环计数器的当前值设置循环计数器的当前值 int get_value() / 查询循环计数器的当前值查询循环计数器的当前值 void increment() / 循环计数器加循环计数器加1 void decrement() / 循环计数器减循环计数器减1 private:int min_val; / 最小值最小值int max_val; / 最大值最大值int current; / 当前值当前值 ;155.2 5.2 类的定义类的定义5.2.3 类界面与类实现类界面与类实现o类实现:源程序*.cpp首先要包含类界面:#include“*.hpp”然后定义成员函数,由于此时成员函数的定义是位于类的外面,因此必须用类名和作用域运算符:来修饰函数名。一般形式为:成员函数类型类名类名:成员函数名(形参表)函数体例:/循环计数器加一voidCIRCULAR_NUMBERS:increment()intmode=max_val-min_val+1;current=(current-min_val)+1)%mode+min_val;return;165.2 5.2 类的定义类的定义5.2.4 标识符的类作用域 o内即为类作用域o在类作用域中声明的标识符只在该类中具有可见性o成员名限定:类中一个成员名字可以使用类名和作用域运算符来显式指定classCvoidC:set(intval)public:value=val;voidset(intval);return;private:intvalue;C:value175.3 5.3 对象的创建对象的创建5.3.1 对象声明对象声明o类:数据类型o具有类类型的变量称为对象,对象称为类的实例。o对象声明一般格式:intmain()CIRCULAR_NUMBERSangle; /角度循环计数器CIRCULAR_NUMBERSmonth;/月份循环计数器angle.set_mode(0,359); /设置角度取值范围从0到359angle.set_value(250);/设置当前角度为250month.set_mode(1,12);/设置月份取值范围从1到12month.set_value(11);/设置当前月为11月小写字母小写字母185.3 5.3 对象的创建对象的创建5.3.1 对象声明对象声明CIRCULAR_NUMBERSangle,month;类类CIRCULAR_NUMBERS的实例set_mode()代码increment()代码decrement()代码set_value()代码get_value()代码对象angle0min_val359max_val250currentset_mode()set_value()get_value()increment()decrement()类CIRCULAR_NUMBER对象month1min_val12max_val11currentset_mode()set_value()get_value()increment()decrement()195.3 5.3 对象的创建对象的创建5.3.1 对象声明对象声明静态数据成员o用static修饰的数据成员:被分配占用一个固定的存储空间,由此类的所有对象共享,对于类来说:静态数据成员相当于类的全局变量。o使用方法:1)在类的界面中(定义)声明一个静态数据成员2)在类实现中,必须再次声明并初始化这个静态数据变量/test1.hpp/test1.cppclassC#include“test1.hpp”private:intx;int C:s = 18 ;inty;staticints;intC:set(inti,intj)public: x=i;intset(int,int);y=j;s+;205.3 5.3 对象的创建对象的创建5.3.1 对象声明对象声明静态数据成员 /test.cpp#include“test1.hpp”voidmain()Cc1,c2;c1.set(100,200);c2.set(15,30);s:18set()代码类C对象c1xyset()对象c2xyset()10020019153020215.3 5.3 对象的创建对象的创建5.3.2 使用对象成员使用对象成员 通过成员选择运算符.来访问/使用对象的公有成员对象名.成员名angle.get_value();angle.setmode(0,359);225.3 5.3 对象的创建对象的创建5.3.3 对象的生存期对象的生存期 对象生存期:对象从被创建开始到被释放为止的时间。数据成员生存期有对象生存期决定,成员函数具有全局生存期(1)局部对象:定义在函数体内或程序块内,作用域限定在函数体或程序块中。(2)静态对象:定义在一个文件中,作用域从定义时起到文件结束。(3)全局对象:定义在某个文件中,作用域在包含该文件的整个程序中。235.4 5.4 对象的初始化对象的初始化5.4.1 构造函数构造函数o类中的一个特殊函数o功能:对该类的对象进行初始化o一般形式:类名(形式参数表);o特点:n构造函数是公有的,可由用户提供,也可由系统提供缺省的。n构造函数可以有任何类型的形参,但是无返回值,也不能指定返回类型。n构造函数在声明一个新对象时调用(对象声明语句中为构造函数提供实参),不可显式调用245.4 5.4 对象的初始化对象的初始化5.4.1 构造函数构造函数程序5.4.1 /程序:程序:CIRNUM4.hpp /功能:循环计数器类头文件,使用构造函数功能:循环计数器类头文件,使用构造函数classCIRCULAR_NUMBERSpublic:CIRCULAR_NUMBERS(intmin,intmax,intvalue);/设置循环计数器的上下限和当前值设置循环计数器的上下限和当前值 int get_value(); / 查询循环计数器的当前值查询循环计数器的当前值 void increment(); / 循环计数器加循环计数器加1 1 void decrement(); / 循环计数器减循环计数器减1 1 private: int min_val; / 最小值最小值 int max_val; / 最大值最大值 int current; / 当前值当前值;255.4 5.4 对象的初始化对象的初始化5.4.1 构造函数构造函数程序5.4.2/设置循环计数器的上下限和当前值CIRCULAR_NUMBERS:CIRCULAR_NUMBERS(intmin,intmax,intvalue)min_val=(min=max)?min:max;max_val=(min=max)?max:min;if(valuemax_val)current=max_val;elsecurrent=value;return;265.4 5.4 对象的初始化对象的初始化5.4.1 构造函数构造函数程序5.4.3intmain()/创建两个循环计数器对象并初始化CIRCULAR_NUMBERSangle(0,359,250);/角度循环计数器CIRCULAR_NUMBERSmonth(1,12,11);/月份循环计数器275.4 5.4 对象的初始化对象的初始化5.4.1 构造函数构造函数程序5.4.4 /程序:程序:CIRDEMO5.cpp /功能:演示全局对象与静态对象的初始化功能:演示全局对象与静态对象的初始化#include“cirnum4.hpp”#includeCIRCULAR_NUMBERSangle(0,359,250);/角度循环计数器作为全局对象intmain()staticCIRCULAR_NUMBERSmonth(1,12,11);/月份循环计数器作为静态对象/显示对象状态cout“Theinitialangleis”angle.get_value()“n”;cout“Theinitialmonthis”month.get_value()“n”;全局对象与静态对象的构造函数在全局对象与静态对象的构造函数在main()函数执行之前被调用函数执行之前被调用285.4 5.4 对象的初始化对象的初始化5.4.1 构造函数构造函数程序5.4.5 /程序:一个时间类程序:一个时间类DATE的例子的例子 /功能:演示多个不同的构造函数功能:演示多个不同的构造函数classDateprotected:intyear;intmonth;intday;public:Date()/构造函数,不带参数构造函数,不带参数year=0;month=1;day=1;Date(inty,intm,intd)/构造函数,带参数构造函数,带参数year=y;month=m;day=d;Date(Date&obj)/构造函数,以一个同类对象为参数构造函数,以一个同类对象为参数year=obj.year;month=obj.month;day=obj.day;voidprint()coutyear“/”month“/”dayendl;295.4 5.4 对象的初始化对象的初始化5.4.2 析析构函数构函数o类中的一个特殊函数o功能:为撤销一个类的对象做善后清理工作(如:回收存储空间)o一般形式:类名();o特点:n析构函数是公有的,可由用户提供,也可由系统提供缺省的。n析构函数不可带任何参数,无返回值,也不能指定返回类型。n在对象生存期结束时,程序将自动调用该对象所属类的析构函数,调用且仅调用一次。305.4 5.4 对象的初始化对象的初始化5.4.2 析析构函数构函数程序5.4.6 /程序:程序:DESTROY.CPP /功能:演示构造函数与析构函数的调用功能:演示构造函数与析构函数的调用#includeclassDEMO_CLASSpublic:DEMO_CLASS(inti);DEMO_CLASS();DEMO_CLASS:DEMO_CLASS(inti)coutInitialvalueisin;return;DEMO_CLASS:DEMO_CLASS()coutGoodbye!n;return;315.4 5.4 对象的初始化对象的初始化5.4.2 析析构函数构函数intmain()DEMO_CLASSobj(30);/声明一个对象coutThisistheendofmain().n;return0;运行结果:Initialvalueis30Thisistheendofmain().Goodbye!325.4 5.4 对象的初始化对象的初始化5.4.3 对象成员的初始化对象成员的初始化 o对象成员:在一个类中声明具有类类型的数据成员o初始化对象成员的方法:在本类的构造函数中调用这些对象成员所属类的构造函数,其一般形式:类名:类名(形参表):初始化列表classApublic:B:B():obj2(10,20), obj1(5,3)A(inta,floatb);classBAobj1,obj2;public:B();335.4 5.4 对象的初始化对象的初始化5.4.3 对象成员的初始化对象成员的初始化 说明o如果有多个对象成员,对象成员构造函数的调用次序取决于这些成员在类中声明的次序。o执行次序:创建类的对象时,调用此类的构造函数,先根据初始化列表调用对象成员的构造函数,初始化对象成员,然后才执行本身的构造函数的函数体。析构函数调用的次序相反。345.4 5.4 对象的初始化对象的初始化5.4.3 对象成员的初始化对象成员的初始化 程序5.4.8 /程序:程序:OBJECT.CPP /功能:演示类中包含有另一个类的对象初始化功能:演示类中包含有另一个类的对象初始化/在构造函数和析构函数中加入输出以便跟踪在构造函数和析构函数中加入输出以便跟踪#includeclassObjectintval;public:Object();/构造函数Object(inti);/构造函数Object();/析构函数;Object:Object()val=0;coutnDefaultconstructorforObject.n;355.4 5.4 对象的初始化对象的初始化5.4.3 对象成员的初始化对象成员的初始化 Object:Object(inti)/构造函数定义val=i;coutnConstructorforObject:valendl;Object:Object()/析构函数定义coutnDestructorforObject:valendl;classContainer/定义新类,它含Object的对象private:intdate;Objectone;/对象成员Objecttwo;/对象成员public:Container();/构造函数Container(inti,intj,intk);/构造函数Container();/析构函数;365.4 5.4 对象的初始化对象的初始化5.4.3 对象成员的初始化对象成员的初始化 Container:Container()/构造函数定义date=0;coutnDefaultconstructorforContainer.n;Container:Container(inti,intj,intk):two(i),one(j)date=k;coutnConstructorforContainer.n;Container:Container()coutnDestructorforContainer.n;voidmain() /演示程序coutn.Enteringmain.n;Containerobj(5,6,10);coutn.Exitingmain.n;375.4 5.4 对象的初始化对象的初始化5.4.3 对象成员的初始化对象成员的初始化 执行结果为:.Enteringmain.ConstructorforObject:6 /对象one调用构造函数ConstructorforObject:5 /对象two调用构造函数ConstructorforContainer./调用Container的构造函数.Exitingmain.DestructorforContainer. /调用Container的析构函数DestructorforObject:5/调用two的析构函数DestructorforObject:6/调用one的析构函数385.4 5.4 对象的初始化对象的初始化5.4.3 对象成员的初始化对象成员的初始化 初始化列表的其他用途o基本数据类型的数据成员也可用初始化列表做初始化classCpublic:C(inti):number(i)C(inti)number=i;private:intnumber;395.4 5.4 对象的初始化对象的初始化5.4.3 对象成员的初始化对象成员的初始化 初始化列表的其他用途o常量数据成员的初始化常量数据成员:不能在类的声明中初始化(类中不能用初值表达式)不能在构造函数中设置其值(赋值操作不能用于常量)只能采用初始化列表中来赋值例:classCC:C(inti):PI(3.14159)public: C(inti);private: constdoublePI;405.4 5.4 对象的初始化对象的初始化5.4.3 对象成员的初始化对象成员的初始化 /程序:程序:OBJECT1.CPP/功能:演示类中包含有另一个类的对象初始化功能:演示类中包含有另一个类的对象初始化#include#includeclassbasepublic:base(char*s)coutConstructforBasesn;base()coutDestructforBasen;classscreenprivate:constunsignedsize;longprice;baseobj;public:screen(ints,longp):size(s),price(p),obj(testing)coutConstructforScreenn;voidlist();screen()coutDestructforScreenn;415.4 5.4 对象的初始化对象的初始化5.4.3 对象成员的初始化对象成员的初始化 voidmain()screennec(14,40000L);nec.list();getch();voidscreen:list()coutThesizeofthescreenis:sizen;coutThepriceofthescreenis:pricen;运行结果:ConstructforBasetestingConstructforScreenThesizeofthescreenis:14Thepriceofthescreenis:40000DestructforScreenDestructforBase425.5 5.5 使用类与对象构造程序的实例使用类与对象构造程序的实例5.5.1 模拟数字式时钟模拟数字式时钟 /程序:CLOCK.HPP/功能:时钟类的头文件#includecirnum4.hpp#includeclassClockpublic:Clock(inthh,intmm,intss);voidupdate();voidshow();private:CIRCULAR_NUMBERShour;CIRCULAR_NUMBERSminute;CIRCULAR_NUMBERSsecond;435.5 5.5 使用类与对象构造程序的实例使用类与对象构造程序的实例5.5.1 模拟数字式时钟模拟数字式时钟 /设置时钟当前值Clock:Clock(inthh,intmm,intss):hour(0,23,hh),minute(0,59,mm),second(0,59,ss)return;voidClock:update()/刷新时间second.increment();if(second.get_value()=0)minute.increment();if(minute.get_value()=0)hour.increment();return;voidClock:show()/显示时间couthour.get_value():minute.get_value():second.get_value()endl;return;445.5 5.5 使用类与对象构造程序的实例使用类与对象构造程序的实例5.5.1 模拟数字式时钟模拟数字式时钟 /程序:TIMEDEMO.cpp/功能:使用类Clock模拟数字式时钟#includeclock.hpp#includeintmain()intloop;Clockrolex(4,15,30);Clockcima(14,0,0);coutRolex:n;/显示rolex对象for(loop=1;loop=100;loop=loop+1)rolex.update();rolex.show();coutCima:n;/显示Cima对象for(loop=1;loop=100;loop=loop+1)cima.update();cima.show();return0;455.5 5.5 使用类与对象构造程序的实例使用类与对象构造程序的实例5.5.2 模拟加油站油泵的对象工作模拟加油站油泵的对象工作 /程序:PUMP.CPP/功能:加油站油泵实现文件#include#includeconstfloatAMTINT=300.0;/初始化油桶中的油量constfloatPRICE=1.25;/单价classPumpprotected:floatamtint,price;public:Pump(float,float);voidvalues();voidrequest(float);465.5 5.5 使用类与对象构造程序的实例使用类与对象构造程序的实例5.5.2 模拟加油站油泵的对象工作模拟加油站油泵的对象工作 Pump:Pump(floatstart,floattodays)amtint=start;price=todays;voidPump:values()coutThegastankhas:amtintendl;coutThepriceperkgofgasis:price=pumpamt)pumped=pumpamt;/满足elsepumped=amtint;amtint=amtint-pumped;/加油后剩余数coutpumpamtkgwererequestedendl;coutpumpedkgwerepumpedendl;coutamtintkgremaininthetankendl;coutThetotalpriceis:(pumped*price)endl;475.5 5.5 使用类与对象构造程序的实例使用类与对象构造程序的实例5.5.2 模拟加油站油泵的对象工作模拟加油站油泵的对象工作 voidmain()Pumpobj(AMTINT,PRICE);obj.values();coutendl;obj.request(30.0);coutendl;obj.request(280.0);程序运行结果:程序运行结果:Thegastankhas:300Thepriceperkgofgasis:1.2530kgwererequested30kgwerepumped270kgremaininthetankThetotalpriceis:37.5280kgwererequested270kgwerepumped0kgremaininthetankThetotalpriceis:337.5485.5 使用类与对象构造程序的实例使用类与对象构造程序的实例5.5.3 单实例对象单实例对象 /程序:SINGLE.HPP/功能:单实例类的头文件classSingle_Instancepublic:Single_Instance();Single_Instance();private:staticintinstance_count;/当前对象实例计数;#includeintSingle_Instance:instance_count=0;/初始化实例计数,注意静态成员的这种用法Single_Instance:Single_Instance()/构造函数中必须为实例计数加1instance_count+;if(instance_count1)coutWarning:morethanoneobjectinstance!endl;Single_Instance:Single_Instance()/析构函数必须为实例计数减1instance_count-;495.5 使用类与对象构造程序的实例使用类与对象构造程序的实例5.5.3 单实例对象单实例对象 /程序:SGL_DEMO.HPP/功能:演示单实例对象的用法#includesingle.hpp#includeintmain()coutIhavethefirstobject.endl;Single_Instanceobj1;coutIhavethesecondobject.endl;Single_Instanceobj2;coutEndofdemostrationangle_ptr-increment();angle.increment();515.6.1 对象指针对象指针this指针oC+为每个对象提供一个指针this,记录该对象的地址,当通过对象来调用类的成员函数时,this作为一个隐式参数传递给成员函数othis的性质n隐式指针,不能显式声明n常指针,不能被修改,当一个类对象被创建时,this就被初始化为指向该对象的指针nthis是一个局部变量,局部于某个对象,在该类的任何非静态成员函数中可见。5.6 指向对象的指针指向对象的指针 52例2:intC:get_value()returnvalue;returnthis-value;set_mode()代码increment()代码decrement()代码set_value()代码get_value()代码对象angle0min_val359max_val250currentset_mode()set_value()get_value()increment()decrement()类CIRCULAR_NUMBER对象month1min_val12max_val11currentset_mode()set_value()get_value()increment()decrement()5.6.1 对象指针对象指针例1:CIRCULAR_NUMBERSangle(0,359,250); /角度循环计数器CIRCULAR_NUMBERSmonth(1,12,11);angle.set_value(100);100thisthisthis5.6 指向对象的指针指向对象的指针 535.6.2 对象的动态创建与撤销对象的动态创建与撤销o运算符new提供了动态存储分配的功能n一般形式:指针名指针名 = new 基类型名基类型名(初始化表初始化表);n若基类型是类类型,则()内为该类的构造函数提供实参。n功能:动态分配一块内存,其大小由基类型决定,若分配成功,则返回该内存的首地址给指针,否则返回NULL5.6 指向对象的指针指向对象的指针 545.6.2 对象的动态创建与撤销对象的动态创建与撤销例1: int*p;p=newint;*p=10;coutlen;p1=newintlen;p10p105.6 指向对象的指针指向对象的指针 555.6.2 对象的动态创建与撤销对象的动态创建与撤销例3:分配类对象CIRCULAR_NUMBERS*angle_ptr;angle_ptrnewCIRCULAR_NUMBERS(0,359,250);if(angle_ptr=NULL)/内存分配失败后的处理else/内存分配成功后的处理5.6 指向对象的指针指向对象的指针 分配空间失败,返回分配空间失败,返回NULL565.6.2 对象的动态创建与撤销对象的动态创建与撤销o运算符delete用于释放用new分配的存储空间一般形式:delete指针名;例:deletep;deletep1;/数组释放时,加则会释放整个分配的区域,否则只会释放一个基类型占用的空间;deleteangel_ptr;用new分配的内存空间,一定要用delete释放,而且只能释放一次。否则将产生“内存垃圾”5.6 指向对象的指针指向对象的指针 575.6.3 对象的复制与比较对象的复制与比较对象的复制与比较是针对对象的数据成员而言的。ClassStudentpublic:Student(constchar*str)strcpy(name,str);Student()private:charname30;/name以数组形式出现Students1,s2;s1=s2;/C+语言提供的缺省情况,s2数据成员逐位复制给s15.6 指向对象的指针指向对象的指针 585.6.3 对象的复制与比较对象的复制与比较ClassStudentpublic:Student(constchar*str)name=newcharstrlen(str)+1;strcpy(name,str);Student()deletename;private:char*name;/name以指针形式出现Students1,s2;s1=s2;/s2中name指针的值复制给s1中的name设计一个专门的复制函数设计一个专门的复制函数 SudentSudent * *copy(Studentcopy(Student *obj1, Student *obj2); *obj1, Student *obj2);5.6 指向对象的指针指向对象的指针 对象对象s1NameLi40对象对象s2Namezhang30595.7 5.7 关于类与对象的进一步讨论关于类与对象的进一步讨论5.7.1 基本数据类型与对象基本数据类型与对象 从本质上,基本数据类型声明的变量与对象是相同的,可以将这些变量也理解成为对象。 Clockcima(14,0,0);/创建Clock对象并初始化inti=5;inti(5);/创建int对象并初始化5.7.2 抽象数据类型抽象数据类型面向对象程序设计的主要任务就是设计类并利用类组面向对象程序设计的主要任务就是设计类并利用类组装程序。装程序。类与对象:类与对象:n类是面向对象程序静态文本中的概念。类是面向对象程序静态文本中的概念。n对象是面向对象程序动态运行时的概念。对象是面向对象程序动态运行时的概念。605.6 5.6 关于类与对象的进一步讨论关于类与对象的进一步讨论5.7.2 抽象数据类型抽象数据类型类与抽象数据类型(类与抽象数据类型(Abstract Data TypeADT):):nADT是类之上的一个抽象描述。是类之上的一个抽象描述。n类是类是ADT的具体实现的具体实现ADT通过定义数据结构上允许的操作的性质来定义一种数通过定义数据结构上允许的操作的性质来定义一种数据类型,其据类型,其“抽象抽象”表现在表现在:o不给出数据的具体表示而只给出值域不给出数据的具体表示而只给出值域o不给出操作的实现细节而只给出其性质不给出操作的实现细节而只给出其性质类作为类作为ADT的实现,其含义有:的实现,其含义有:o给出了具体的数据结构表示给出了具体的数据结构表示o用面向对象程序设计语言给出了完成操作的语句序列用面向对象程序设计语言给出了完成操作的语句序列对象对象类类抽象数据类型抽象数据类型抽象抽象抽象抽象具体具体具体具体615.7 5.7 关于类与对象的进一步讨论关于类与对象的进一步讨论5.7.3 设计良好的类界面设计良好的类界面 设计类界面应考虑:n类界面具有完备性:提供的服务完整、全面。n类界面无二义性:提供的服务无二义、简单易理解。n类界面无冗余:提供的服务避免重复。5.7.4 再论对象再论对象o对象是实体在计算机中的模拟:实体中的信息处理与实体之间的信息传递o对象是属性与行为的封装单位:C+中对象的通信是通过调用其他对象的成员函数来实现。 o对象作为具有输入/输出的有限自动机:以其他对象的输出作为自己的输入,自己的输入作为其他对象的输入,通信自动机。62习题P.1761805-4,5-5,5-963
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号