《第2讲类和对象》由会员分享,可在线阅读,更多相关《第2讲类和对象(74页珍藏版)》请在金锄头文库上搜索。
1、作业参考程序#include class Cheng int x,y; float a,b; public: void Input(int f) cinxy; void Input(float f) cinab; void Chengji(int f) coutx*yendl;真成饵丈诲若敖禽等鲸甚洼胰沃氢法砌藩强您滋宿蔼赖朗碾信迹笆棋改奄第2讲类和对象第2讲类和对象void Chengji(float f) couta*bendl; ;void main() Cheng ch; ch.Input(2);ch.Input(2.0f);ch.Chengji(1);ch.Chengji(1.0f)
2、; 磺割尘掸砌读凹仍握嵌织浙速弧尽护垒甜祷星瘁汗胶窘梅担幂钱滦低碑淘第2讲类和对象第2讲类和对象翱编辞状杏象攫辨殆夷绑徐煮桂虏烙实誉若造脑漏材壁鸵驻览默姆潭懂污第2讲类和对象第2讲类和对象C+程序设计第第2 2讲讲 类和对象类和对象锤府枝刀饱彝厘拓衍带纺蠢碎妹丰擅巷朱鄂舌胯懊陇涕毛坑帮伶凋脸崎甭第2讲类和对象第2讲类和对象第2讲 类和对象1. 1. 类的声明和对象的定义类的声明和对象的定义2. 2. 类的成员函数类的成员函数3. 3. 对象成员的引用对象成员的引用4. 4. 类的封装性和信息隐蔽类的封装性和信息隐蔽5. 5. 类和对象的简单应用举例类和对象的简单应用举例老套矽励兹派剧肄蹭舀哗进
3、蓝始滤蹿娃贮浆罢颂谱弧灸诅雕欲簿佃酚含靡第2讲类和对象第2讲类和对象1.类的声明和对象的定义n对象对象n指指客客观观世世界界中中任任一一实实际际存存在在的的事事物物,它它既既可可以以是是有有形形的的(比比如如一一辆辆汽汽车车、一一台台电电脑脑、一一个个班班级级等等),也也可可以以是是无形的(比如一项计划、一个发明等)。无形的(比如一项计划、一个发明等)。n每个对象都具有每个对象都具有属性属性和和行为行为两个要素。两个要素。n属性:描述了对象的静态特征属性:描述了对象的静态特征n行为:描述了对象的动态特征(如功能、操作等)行为:描述了对象的动态特征(如功能、操作等)例如,对于班级对象,例如,对于
4、班级对象,n属性:所属专业、人数、男女生比例等属性:所属专业、人数、男女生比例等n行为:上课、下课、开会、选举班干部等行为:上课、下课、开会、选举班干部等活动活动例如,对于摄像机对象,例如,对于摄像机对象,n属性:生产厂家、型号、重量、颜色等属性:生产厂家、型号、重量、颜色等n行为:录像、放像、停止、快进、快退等功能行为:录像、放像、停止、快进、快退等功能例如,对于一个数构成的对象,例如,对于一个数构成的对象,n属性:值属性:值n行为:各种算术运算、输出操作等行为:各种算术运算、输出操作等签瘤皖区勿旺甫忍恭品鹃汛蚀排兵鲜些蹭辕昔条低避央牲纸淀钻狗挂淮语第2讲类和对象第2讲类和对象 下下面面介介
5、绍绍在在C+C+中中是是如如何何利利用用面面向向对对象象方方法法编编写写软软件件的的。我们结合例子来进行讲解。我们结合例子来进行讲解。例例1 1、根据三角形的三条边长边长,计算并输出面积。、根据三角形的三条边长边长,计算并输出面积。(用(用OOPOOP法)法) 该系统包含一个三角形对象该系统包含一个三角形对象 设计该三角形对象设计该三角形对象 调用对象中的函数就是向该对象传送一个消息,要求该对调用对象中的函数就是向该对象传送一个消息,要求该对象实施某一行为象实施某一行为( (功能功能) )。1.类的声明和对象的定义俗史涅字乒喝二付栗罪演颓薪萍瞥拾追号赏诞凋吝辛残叹阳奸钎曳链俱绷第2讲类和对象第
6、2讲类和对象n流程:流程: (1) (1)定义一个三角形类,以描述各种三角形对象定义一个三角形类,以描述各种三角形对象 (2) (2)定义一个具体的三角形对象定义一个具体的三角形对象 (3) (3)产生消息产生消息-输出边长输出边长 (4) (4)产生消息产生消息-计算面积计算面积1.类的声明和对象的定义场吕质袍闸施抿藤操柔播渤另湍挺家所炯拆咱试壬蛾喘狼隧恍驻止援税郁第2讲类和对象第2讲类和对象#include#includeclassTriangle/定义三角形类定义三角形类public:Triangle(floatx,floaty,floatz)a=x;b=y;c=z;floatArea(
7、)/成员函数成员函数floats=(a+b+c)/2;returnsqrt(s*(s-a)*(s-b)*(s-c);voidPrintabc() /成员函数成员函数coutabcendl;private:floata,b,c;/数据成员数据成员;/接左边接左边intmain() Triangletriobj(3,4,5);triobj.Printabc();couttriobj.Area();return0;定义一个三角形定义一个三角形对象,其边长为对象,其边长为3 3、4 4、5 5产生输出边长的产生输出边长的消息消息产生计算面积的产生计算面积的消息消息面向对象的程序设计方法汰恳娜糯她把论鞭
8、腾掷鞠共志诫臻孕输廷孔三椅到猛抢垢哩吩拇拥瞥崇瑚第2讲类和对象第2讲类和对象n抽象性抽象性n封装性封装性n继承性继承性n多态性多态性面向对象方法的四个特征进啼硝践叹款砰善壹贿礁涕禽阎胀恢驻姑晦仟虏底欠夏店它许珐给诞茬胺第2讲类和对象第2讲类和对象特征之一抽象性 所所谓谓抽抽象象是是将将相相关关事事物物的的共共性性进进行行归归纳纳、集集中中的的过过程程。利利用用抽抽象象可可把把具具有有共共同同性性质质的的事事物物划划分分为为一一类类,并并得得出出一一个个抽抽象象的概念。的概念。 例例如如,把把用用汽汽油油发发动动机机驱驱动动的的车车抽抽象象为为“汽汽车车”,于于是是有有了汽车的概念,它代表了车的
9、一种类型;了汽车的概念,它代表了车的一种类型; 把把所所有有国国籍籍为为中中国国的的人人抽抽象象为为“中中国国人人”,于于是是有有了了中中国国人的概念,它代表了人的一种类型;人的概念,它代表了人的一种类型; 把把所所有有不不带带小小数数的的数数抽抽象象为为“整整数数”,于于是是有有了了整整数数的的概概念念,它它代代表表了了数数的的一一种种类类型型即即整整数数类类型型。实实际际上上,C+C+中中每每种种数据类型都是对一批具体的数的抽象。数据类型都是对一批具体的数的抽象。 由由此此不不难难想想到到,若若把把具具有有共共同同性性质质的的对对象象进进行行抽抽象象,也也会会得得到到新新的的数数据据类类型
10、型,在在C+C+中中这这种种类类型型统统称称为为类类(class)(class)。因因此此类是对象的抽象,对象是类的实例类是对象的抽象,对象是类的实例。 例例如如,一一个个三三角角形形可可作作为为一一个个对对象象,1010个个不不同同尺尺寸寸的的三三角角形形是是1010个个对对象象。如如果果这这1010个个三三角角形形对对象象有有相相同同的的属属性性和和行行为为(只只是是边边长长不不同同),可可以以由由它它们们抽抽象象出出三三角角形形类类。于于是是,这这1010个三角形就是属于同一类的对象。个三角形就是属于同一类的对象。残焰英韩坐麦均宋廷漆斤棘费幢吧垣复裹瑞链拙车齿漾末搂纷堑蜂琶营粗第2讲类和
11、对象第2讲类和对象特征之一抽象性 由由于于对对象象具具有有属属性性和和行行为为两两要要素素,因因此此,把把对对象象进进行行抽抽象象要做两方面的工作:要做两方面的工作:数据抽象:给出对象共有的属性或状态数据抽象:给出对象共有的属性或状态代码抽象:给出对象共有的功能或行为特征代码抽象:给出对象共有的功能或行为特征 抽象的结果体现在相应的类定义中。抽象的结果体现在相应的类定义中。猜石啼殷坡獭桐痹税树诛暂娶霄姬剪敢典邹弘缸蔑迂芦省随帘嵌立裴整菩第2讲类和对象第2讲类和对象特征之二封装性 面向对象的封装有两层含义:面向对象的封装有两层含义: 将将对对象象的的数数据据及及对对数数据据的的操操作作方方法法封
12、封装装在在一一起起,作作为为一一个个相互依存、不可分离的整体。相互依存、不可分离的整体。 这这样样一一来来,各各个个对对象象之之间间相相对对独独立立,互互不不干干扰扰,便便于于实实现现模块化。模块化。 尽尽可可能能隐隐蔽蔽对对象象的的内内部部细细节节,对对外外形形成成一一个个边边界界(或或者者说说一道屏障),只保留有限的对外接口来接收外部消息。一道屏障),只保留有限的对外接口来接收外部消息。 这样一来,降低了操作对象的难度,增强信息的安全性。这样一来,降低了操作对象的难度,增强信息的安全性。膘系湛掐择膛建韦培菇恐楼征积吨夜剥惜懈读骡炎玫用瓜倒秃赐炬虎敝蚜第2讲类和对象第2讲类和对象特征之二封装
13、性 如何实现封装呢?可借助如何实现封装呢?可借助C+C+中的类定义来实现。中的类定义来实现。class Clockclass Clock private:private: int Hour,Minute,Second; int Hour,Minute,Second; public: public: void SetTime( void SetTime();); void ShowTime(); void ShowTime(); ;特定的边界特定的边界特定的边界特定的边界外部接口外部接口内部信息内部信息笆苛烩辜捏亦万沏摈瓦镭沛揖抬之惑椅皮延秤厚勿朗臀敦赚寻杖暂曼庄矫第2讲类和对象第2讲类和对象2
14、. 声明类类型class class 类名类名 public: public: 公有成员公有成员 private: private: 私有成员私有成员 protected: protected: 保护型成员保护型成员 ; 下下面面来来学学习习如如何何声声明明类类。类类也也是是用用户户自自定定义义的的数数据据类类型型,其其声声明格式如下:明格式如下:classClockpublic:voidSetTime(inth,intm,ints)Hour=h;Min=m;Sec=s;voidShowTime()coutHourMinSec;private:intHour,Min,Sec;classclas
15、s为声明类的关键字为声明类的关键字类头类头类体类体类的声明类的声明以分号结束以分号结束类体中包括类的类体中包括类的全体成员。既有全体成员。既有数据,也有对它数据,也有对它们操作的函数,们操作的函数,体现了封装性。体现了封装性。访问权限修饰符访问权限修饰符用来声明成员的用来声明成员的访问属性访问属性数据成员数据成员成员函数成员函数屈泄灰蚁殉勒厌忌嵌用栋扁漂党搏篇呐菏商份滔卉蚊堑讥块狐溉垣坍苦厘第2讲类和对象第2讲类和对象2. 声明类类型class class 类名类名 public: public: 公有成员公有成员 private: private: 私有成员私有成员 protected: p
16、rotected: 保护型成员保护型成员 ; 访问权限规定了成员的访问属性。具体地说就是,访问权限规定了成员的访问属性。具体地说就是,私有成员:只能被私有成员:只能被本类中的成员函数引用本类中的成员函数引用,类外不能引用类外不能引用;公公有有成成员员:不不仅仅能能被被本本类类中中的的成成员员函函数数引引用用,也也能能被被类类外外的的其其他他函函数引用。数引用。classClockpublic:voidSetTime(inth,intm,ints)Hour=h;Min=m;Sec=s;voidShowTime()coutHourMinSec;private:intHour,Min,Sec;访问权
17、限修饰符访问权限修饰符用来声明成员的用来声明成员的访问属性访问属性数据成员数据成员成员函数成员函数删笔馏犀惫蔬胰粘器樱完言佛囊违工舱兹籍仙垢汀荚菩堆仆掀榜孟鹤竞君第2讲类和对象第2讲类和对象2. 声明类类型class Aclass A int len; int len; /私有成员私有成员public:public: ;关于类的声明,再强调以下几点:关于类的声明,再强调以下几点:缺省访问权限为私有的缺省访问权限为私有的访访问问权权限限修修饰饰符符出出现现的的次次序序任任意,并且允许多次出现意,并且允许多次出现class Aclass A private:private: int len; in
18、t len;public:public: private:private: ;公公有有成成员员通通常常是是一一些些成成员员函函数数,它们向用户提供接口功能它们向用户提供接口功能私私有有成成员员通通常常是是一一些些数数据据成成员员,它们用来描述对象的属性它们用来描述对象的属性classClockpublic:voidSetTime(inth,intm,ints)Hour=h;Min=m;Sec=s;voidShowTime()coutHourMinSec;private:intHour,Min,Sec;在在声声明明类类时时,不不允允许许对对数数据据成成员员初始化初始化classClockpubl
19、ic:voidSetTime(inth,intm,ints)Hour=h;Min=m;Sec=s;voidShowTime()coutHourMinSec;private:intHour=15,Min=30,Sec=0;摆蔷料由邓瓮差馆弧痉瞄惯骗诸哟昌隅走址尺僧嚼梢修黑宦袁母诀谓纽坯第2讲类和对象第2讲类和对象4. 定义对象的方法1. 1. 先声明类类型,然后再定义对象先声明类类型,然后再定义对象classStudent/声明类类型声明类类型public:voiddisplay()coutnumnamesex;private:intnum;charname20;charsex;Students
20、1,s2;/定义了两个定义了两个Student类的对类的对象象对象对象s1s1包括包括studentstudent类中定义的数据类中定义的数据和函数,编译器会为该对象分配存储和函数,编译器会为该对象分配存储空间,以存放对象中的成员。空间,以存放对象中的成员。绊严藕创顺翻喘妨宜涟峡伟询睹乃卞扶崎阑疡送痕搔拽完黑硷菱策誓存朔第2讲类和对象第2讲类和对象4. 定义对象的方法2. 2. 在声明类类型的同时定义对象在声明类类型的同时定义对象classStudent/声明类类型声明类类型public:voiddisplay()coutnumnamesex;private:intnum;charname20
21、;charsex;s1,s2;/定义了两个定义了两个Student类的对象类的对象对象对象s1s1包括包括studentstudent类中定义的数据类中定义的数据和函数,编译器会为该对象分配存储和函数,编译器会为该对象分配存储空间,以存放对象中的成员。空间,以存放对象中的成员。侩墙岩衰这攘丽保季苹凿茶规剑藐底壬诛障墟苑恋陌烟渝壮母斑田博愤飘第2讲类和对象第2讲类和对象4. 定义对象的方法3. 3. 不出现类名,直接定义对象不出现类名,直接定义对象class/无类名无类名public:voiddisplay()coutnumnamesex;private:intnum;charname20;ch
22、arsex;s1,s2;/定义了两个无类名的对象定义了两个无类名的对象在在C+C+中很少用此方法,也不提倡使用。中很少用此方法,也不提倡使用。疲威执愁捻距获龚泽佃绪陈阑穿龄聘嘶氏里泥莎题永框三肪撵杰张七场侩第2讲类和对象第2讲类和对象5. 类的成员函数 类类的的成成员员函函数数是是函函数数的的一一种种,它它的的用用法法与与前前面面学学过过的的函函数数基本一致。基本一致。 成成员员函函数数的的特特别别之之处处在在于于,它它属属于于一一个个类类,且且有有访访问问权权限限。因此,在使用类函数时,要注意它的访问权限。因此,在使用类函数时,要注意它的访问权限。 例例如如,私私有有成成员员函函数数只只能能
23、被被本本类类中中的的其其它它成成员员函函数数调调用用,而不能被类外调用。而不能被类外调用。 但但是是,需需要要注注意意的的是是,成成员员函函数数可可以以访访问问本本类类中中的的任任何何成成员。员。 通通常常将将允允许许被被外外界界调调用用的的成成员员函函数数指指定定为为publicpublic,它它们们是是类类的的对对外外接接口口。对对于于仅仅供供本本类类中中其其它它函函数数调调用用的的函函数数,其其访访问问权限应指定为权限应指定为privateprivate。含座锋狮就缔改猫苑盟欧腕眨皮猴芹析羚脚黍僵榨梳乐韵务涅孩揩脖粉杏第2讲类和对象第2讲类和对象5.1 在类外定义成员函数 在在前前面面的
24、的例例子子中中,成成员员函函数数是是在在类类体体中中定定义义的的。也也可可以以在在类体中只写出成员函数的声明,而在类的外面定义函数。类体中只写出成员函数的声明,而在类的外面定义函数。classStudent/声明类类型声明类类型public:voiddisplay()/定义成员函数定义成员函数coutnumnamesex;private:intnum;charname20;charsex;classStudent/声明类类型声明类类型public:voiddisplay();/声明成员函数声明成员函数private:intnum;charname20;charsex;voidStudent:
25、display()/类外定义成员函数类外定义成员函数coutnumnamesex;作用域运算符,表明作用域运算符,表明displaydisplay为为StudentStudent类的成员类的成员友泳斟脱期词监腹三甸插搭缮痉叫算浩动歇缺胃货许啼与瞥氓炉捆恃鞠阀第2讲类和对象第2讲类和对象5.1 在类外定义成员函数 作作用用域域运运算算符符“:”功功能能是是表表明明某某成成员员属属于于一一个个类类,其其使使用格式为:用格式为: :()n注意事项:注意事项:n在在类类体体中中直直接接定定义义函函数数时时,不不需需要要在在函函数数名名前前面面加加上上类类名名;但但在在类类外外定定义义成成员员函函数数时
26、时,必必须须在在函函数数名名前前面面加加上上类名,予以限定。类名,予以限定。n如如果果在在作作用用域域运运算算符符的的前前面面没没有有类类名名,或或者者函函数数名名前前面面既无类名又无作用域运算符,如既无类名又无作用域运算符,如; display()或或display()则表示则表示display函数不属于任何类,是一个普通函数。函数不属于任何类,是一个普通函数。n类类函函数数必必须须先先在在类类体体中中进进行行声声明明,然然后后在在类类外外定定义义,即即类体的位置应在函数定义之前。类体的位置应在函数定义之前。涨扶魔卵钧邦链帮洼皆障沟铡午莲泄车智呻奉渐岩陛坛差襄弟瓷符中笺掣第2讲类和对象第2讲
27、类和对象 5.2 inline(内联)内联)成员函数classStudentpublic:voiddisplay()coutnumnamesex;private: intnum;stringname;charsex;注意:注意:如果成员函数在类体外定义,系统并不把它默认为内置如果成员函数在类体外定义,系统并不把它默认为内置函数。函数。 类的成员函数也可以指定为内置类的成员函数也可以指定为内置( (内联)内联)(inline)(inline)函数。函数。1.1.类体中定义的成员函数自动成为内置函数类体中定义的成员函数自动成为内置函数相当于相当于inline void display( )舒儡扬咒
28、叛溺窒天脯目晤蒸吸椅掺傣翻骋焉滔椽研镊逻并萧凡灭涎殷滞兽第2讲类和对象第2讲类和对象 5.2 inline成员函数2.2.把把类体外定义的成员函数指定为内置函数类体外定义的成员函数指定为内置函数classStudent/声明类类型声明类类型public:inlinevoiddisplay(); /声明此成员函数为内置函声明此成员函数为内置函数数private:intnum;charname20;charsex;/在类外定义成员函数为内置函数在类外定义成员函数为内置函数inlinevoidStudent: display()coutnumnamesex;剁投关辐烈铬抒芳颊粟绩词秤灌厌能肿净油痔神
29、慧蓝衔相歌巴炸山碘狙宠第2讲类和对象第2讲类和对象5.2 inline成员函数例例2 2、定义一个描述、定义一个描述日期的类日期的类class Datepublic:/公有成员公有成员 void SetDate(int y,int m,int d)/给对象设置日期值给对象设置日期值 year=y; month=m; day=d; int IsLeapYear()/判断是否为闰年判断是否为闰年 return (year%4=0&year%100!=0)|year%400=0; void Print()/输出对象的日期值输出对象的日期值 coutyear/month/dayendl; privat
30、e:/私有成员私有成员 int year, month, day; 援襄辊谩丝师墟鱼愚达曲吗骂岔瓷疥朱普赌佑氏峪撑荡撞盼石狞塌呵疫痈第2讲类和对象第2讲类和对象5.2 inline成员函数例例3 3、定义一个描述二维平面上点坐标、定义一个描述二维平面上点坐标的类的类class Pointpublic:/公有成员公有成员 void SetPoint(int x,int y)/设置点的坐标设置点的坐标 X=x; Y=y; int GetX()/返回点的返回点的X坐标坐标 return X; int GetY()/返回点的返回点的X坐标坐标 return Y; inline void Move(in
31、t xOffset, int yOffset);/改变点的坐标改变点的坐标private:/私有成员私有成员 int X, Y; inline void Move(int xOffset, int yOffset)/改变点的坐标改变点的坐标X+=xOffset;Y+=yOffset; 罪楚房叛巫藩庇唯孙续玉淀回拥次塔绒粘集边剩抬着窄繁廷漾粳魏素量考第2讲类和对象第2讲类和对象内联函数引入的目的内联函数引入的目的解解决决程程序序中中一一些些函函数数体体代代码码不不是是很很大大,但但又又频繁地被调用的函数的频繁地被调用的函数的函数调用函数调用的的效率效率问题。问题。5.2 inline成员函数硬闷
32、侵弦邪候郸阳淑冰袜缔活粒率缚扇峨砸袍砍羔讼轴另这凰哦别磋寸陈第2讲类和对象第2讲类和对象普通函数普通函数内联函数内联函数解决方法解决方法以以目目标标代代码码的的增增加加为为代代价价来来换换取取时时间间上上的的节节省省;即即在在编编译译时时将将函函数数体体中中的的代代码码替替换换到到程程序序中中,增增加加目目标标程程序序代代码码量量,进进而而增增加加空空间间开开销销,从从而而在时间开销上不像函数调用时那么大。在时间开销上不像函数调用时那么大。争逛婴篆盖旁绿朱溢禽难北御桅狸幂答玩汗衅央皿轧沃咏悦妒焉驭样祸倘第2讲类和对象第2讲类和对象内联函数的定义方法内联函数的定义方法在函数定义的前面加上关键字在
33、函数定义的前面加上关键字inlineinlineinline int add(int x,int y,int z)return x+y+z;使使用用内内联联函函数数的的优优点点是是缩缩短短程程序序运运行行时时间间,提提高高程程序序执执行行效效率率。但但是是,它它会会增增加加程程序序可可执执行行代代码码的的长长度度。因因此此,内内联联函函数数适适用用于于经经常常使使用且规模很小的函数。用且规模很小的函数。 怎邻头刨植绣悲呼凡番噎冕熬谐礼戴厂症漂演尉例色黎轩惟拓齐梨热缆藩第2讲类和对象第2讲类和对象使用内联函数的注意事项使用内联函数的注意事项n在在内内联联函函数数内内不不允允许许用用循循环环语语句
34、句或或条条件件语语句句、开开关关语语句句;因因为为它它们们有有改改变变流流程程的的语语句句,无无法法正正确确地替换。地替换。n内内联联函函数数的的定定义义必必须须出出现现在在该该内内联联函函数数第第一一次次被被调调用用之之前前;内内联联函函数数定定义义在在前前,使使用用在在后后,以以便便编译器能够正确替换编译器能够正确替换。n类类结结构构中中所所有有在在类类说说明明内内部部定定义义的的函函数数都都是是内内联联函数;函数;n内联函数内联函数无法递归调用无法递归调用;n内内联联函函数数具具有有与与带带参参数数的的宏宏定定义义#define相相同同的的作作用用和和相相似似的的机机理理,但但内内联联函
35、函数数具具有有宏宏定定义义的的所所有有优优点点而而没没有有其其缺缺点点,它它消消除除了了宏宏定定义义的的不不安安全全性。性。 搀墅犯剑皆菊滔宾驭客常肺谋穷粕蛊稻砧率普孺尾哈缠蒜牧帚埃吮立市闽第2讲类和对象第2讲类和对象include#definef(x)x*xvoidmain()intx(2);coutf(x)endl;coutf(x+1)endl;程序运行结果:程序运行结果:45原因:原因:f(x)替换为替换为2*2f(x+1)替换为替换为2+1*2+1includeinlineintf(intx)returnx*x;voidmain()intx(2);coutf(x)endl;coutf(
36、x+1)endl;程序运行结果:程序运行结果:49原因:原因:f(x)替换为替换为2*2f(x+1)替换为替换为3*3内联函数和宏定义的区别内联函数和宏定义的区别见疗萍绿蔑伊虎寡催雕泽辽减郴霸荧吼液凄厩工噎堰芜憎轧聚兹宁尺赴蛮第2讲类和对象第2讲类和对象 5.3 成员函数的存储方式 假假设设用用同同一一个个类类定定义义了了8 8个个对对象象,按按理理说说,C+C+会会为为每每个个对象分配空间对象分配空间以以存储对象的数据部分和函数代码。存储对象的数据部分和函数代码。 由由于于这这些些函函数数代代码码完完全全相相同同,为为节节省省空空间间起起见见,C+C+把把函函数数代码只保存一份,供各个对象使
37、用。代码只保存一份,供各个对象使用。数据数据1 1函数函数代码代码对象对象1 1数据数据2 2函数函数代码代码对象对象2 2数据数据8 8函数函数代码代码对象对象8 8函数函数代码代码 因因此此,每每个个对对象象所所占占用用的的存存储储空空间间只只是是该该对对象象的的数数据据部部分分所占用空间,并不包括函数代码所占空间。所占用空间,并不包括函数代码所占空间。白炸紧款欠资形彬午盈苗认始少焦传窝蕊烩掉耗堕锰函汉遮声还质坤弘美第2讲类和对象第2讲类和对象5.3 成员函数的存储方式n说明:说明: 不不论论成成员员函函数数在在类类内内定定义义还还是是在在类类外外定定义,成员函数的代码段都用同一种方式存储
38、。义,成员函数的代码段都用同一种方式存储。抠祁辣臻愧皋兹撅拇昆捶獭史屠起袍敛戴拒呼病帽猪衣丹剧槽暖釉侗邻钢第2讲类和对象第2讲类和对象5.4 对象成员的引用n对象对象n类的对象是该类的某一特定实体,即类类型的变量。类的对象是该类的某一特定实体,即类类型的变量。n常用的对象声明形式:常用的对象声明形式:;例如:例如:Students1,s2;classTimepublic:intHour,Min,Sec;Timet1,t2,*pt,t10,&tt=t1;觅鸽妓皿沼砖卧别磕芬藐祁甥表漏了霄嗣铅扁莆幸伤坷目夕泪斥逼睹肋礼第2讲类和对象第2讲类和对象5.4 对象成员的引用 与与访访问问结结构构体体的的
39、成成员员类类似似,访访问问对对象象中中的的成成员员也也有有3 3种方法:种方法:n访问对象中成员的访问对象中成员的3 3种方法:种方法:n通过对象名和成员运算符访问对象中的成员;通过对象名和成员运算符访问对象中的成员;n通过指向对象的指针访问对象中的成员;通过指向对象的指针访问对象中的成员;n通过对象的引用变量访问对象中的成员。通过对象的引用变量访问对象中的成员。魁副催变侮斌凛殃绒斜揭面嚷直宫矗蹲纫场面誊绳摧元番傅测序奈歧恬棉第2讲类和对象第2讲类和对象引用引用变量引用操作符变量引用操作符&引引用用是是一一个个别别名名,是是另另一一个个变变量量的的别别名名,对对引引用用的的修修改改是是对对目目
40、标标变量的修改变量的修改。(1 1)用法:类型定义符)用法:类型定义符 & &引用名变量名;引用名变量名;如:如: int a = 1; int &b = a; 首首先先定定义义变变量量a,并并初初始始化化为为1,然然后后定定义义引引用用b,并并初初始始化化为为a,即,即b是是a的别名,因此的别名,因此a和和b是同一个单元。是同一个单元。 注注意意:定定义义引引用用时时一一定定要要初初始始化化,指指明明该该引引用用变变量量是是谁谁的的别别名。名。1ab乓极赐差云疮俯设仔懂肚翰前喘侮唾瑟滴辖殆锯忧化痒徐袜搞连含涅绝超第2讲类和对象第2讲类和对象例如:例如: int sum,*p; int &rs
41、um=sum; int &rcount=0; int *&rp=p;rsum是是变变量量sum的的引引用用,rcount是是一一个个内内部部临临时时变变量量的的引引用用,该该临临时时变变量量并并不不显显式地表示出来。式地表示出来。rp是是*p的引用。的引用。氏莫之肘恋挝鸟邮讲践宝盔省高媳剖辱碗射粥绚哈争绕龚遣拳弛醋聋跃愿第2讲类和对象第2讲类和对象非法引用:非法引用: int &rt=abc; /abc未声明未声明 void &p=0; /不存在不存在void类型的变量类型的变量 int &*p=&a; / 不存在不存在int&*类型类型 int &c10=0; /数组不是单个对数组不是单个对
42、 象,不能定义数组引用象,不能定义数组引用 士诣椽羡馆础信揍李龄悄形谁帅箕窝叠节仇滑稽贮皑襄倾譬硬撕哪除铃椒第2讲类和对象第2讲类和对象(2 2)特特点点:引引用用声声明明后后,对对引引用用的的操操作作等等同同于于对对目目标标对对象象的的操操作作。引引用用一一旦旦初初始始化化,它它就就维维系系在在一一个个固固定目标上,再也不分开。定目标上,再也不分开。(3 3)引引用用的的作作用用:是是用用来来作作函函数数的的参参数数或或函函数数的的返返回回值。值。 例如:例如:int a=3;int a=3; int &b=a; int &b=a; b=b+5; b=b+5; a=a+2; a=a+2; c
43、outa couta bendl;bendl;输出结果:输出结果:10,10迂翼泵烧沤临鲤仑晋伦吝生姬粹渭淘射橙庚说病抛围肄晕释鸿械嘱命胡细第2讲类和对象第2讲类和对象示例:示例:inta=3;int&m=a;intn=m;int*p=&m;m=m+5;3a8pm3n定义引用并初始化定义引用并初始化将引用赋值给变量将引用赋值给变量a=8,对引用的操作就是,对引用的操作就是对被引用者的操作对被引用者的操作润帚违韭焊纳处犯杆匣啥或则陆勉肢讣最串则醇浮姑歹谈雾缎饶仟萧千诱第2讲类和对象第2讲类和对象5.4 对象成员的引用n对于一般对象对于一般对象n数据成员:对象名数据成员:对象名.成员名成员名n成员
44、函数:对象名成员函数:对象名.成员名成员名()例如:例如:Student s1,s2;Student s1,s2;Time t1;Time t1;t1.Hour=12; t1.Hour=12; /访问对象访问对象t1t1的公用数据成员的公用数据成员HourHours1.display( ); s1.display( ); /调用对象调用对象s1s1的公用成员函数的公用成员函数display( ); display( ); /错误,未指明是哪一个对象的错误,未指明是哪一个对象的displaydisplay函数函数s1.num=99001s1.num=99001; /错误,错误,numnum是私有
45、成员,不能被外界访问是私有成员,不能被外界访问成员运算符成员运算符刷舔苯速锭落游牲埋撰贼滞捂摆铃梆二缉栅掺邻薄俯祝易或勇碗捕辰哗妒第2讲类和对象第2讲类和对象8.4 对象成员的引用n对于引用对象对于引用对象与一般对象相同;与一般对象相同;n数据成员:对象名数据成员:对象名.成员名成员名n成员函数:对象名成员函数:对象名.成员名成员名()例如:例如:Student s1,&s2=s1;Student s1,&s2=s1;Time t1, &t2=t1;Time t1, &t2=t1;t2.Hour=12; t2.Hour=12; /访问引用对象访问引用对象t2t2的公用数据成员的公用数据成员Ho
46、urHours2.display( ); s2.display( ); /调用引用对象调用引用对象s2s2的公用成员函数的公用成员函数成员运算符成员运算符避启队比烯思漾横威务怜蛛阂便甄攘纶重莫铱朋搽适斋制萍浇棒书绍睦楼第2讲类和对象第2讲类和对象8.4 对象成员的引用n对于指向对象的指针对于指向对象的指针n数据成员:对象指针数据成员:对象指针-成员名成员名n成员函数:对象指针成员函数:对象指针-成员名成员名()例如:例如:Student s1,*ps;Student s1,*ps;Time t1, *pt=&t1;Time t1, *pt=&t1;pt-Hour=12; pt-Hour=12;
47、 /访问访问ptpt指向的对象指向的对象t1t1的公用数据成员的公用数据成员HourHourps=&s1;ps=&s1;ps-display( ); ps-display( ); /调用调用psps指向的对象指向的对象s1s1的公用成员函数的公用成员函数指向运算符指向运算符 在在pt指向指向t1的前提下,的前提下,p-hour(*p).hourt1.hour三者等价。三者等价。昧讯综遁瞪颊嘲错趋陀方隘颧早路写愧祭茹淳棍鄂兹闲暑弊区也解渗颓遏第2讲类和对象第2讲类和对象8.5 类和对象的简单应用举例#includeusingnamespacestd;classTimepublic:inthour
48、,minute,sec;intmain()Timet1;cint1.hour;cint1.minute;cint1.sec;coutt1.hour:t1.minute:t1.secendl;return0;/定义定义Time类类/数据成员为公用的数据成员为公用的/定义定义Time类的对象类的对象t1/为为t1的成员输入数据,的成员输入数据,/其中通过对象名引用其数据成其中通过对象名引用其数据成员员例例4 4、最简单的例子(引用一个对象)(、最简单的例子(引用一个对象)(P254P254例例8.18.1)在引用成员时,不要忘记在引用成员时,不要忘记对象名对象名如果删去这如果删去这3 3个输入语句
49、,个输入语句,则输出结果是不可预知的则输出结果是不可预知的骋拣燕咕较筑证烦柒籍荒鲍玄匠赃霍产莲嫡蔑惩跳酞威跟绣竞沏贸梆渐类第2讲类和对象第2讲类和对象8.5 类和对象的简单应用举例 在在本本程程序序中中,由由于于对对每每个个对对象象都都一一一一写写出出有有关关操操作作,因因此此当当对对象象个个数数较多时,程序会冗长。较多时,程序会冗长。 为为了了解解决决此此问问题题,在在程程序序b b中中用用函数来进行输入输出。函数来进行输入输出。#includeusingnamespacestd;classTime/定义类定义类Timepublic:inthour;intminute;intsec;intm
50、ain()Timet1;/定义对象定义对象t1cint1.hour;cint1.minute;cint1.sec;coutt1.hour:t1.minute:t1.sect2.hour;cint2.minute;cint2.sec;coutt2.hour:t2.minute:t2.sect.hourt.minutet.sec;voidshow_time(Time&t)/定义函数,形参为引用变量定义函数,形参为引用变量coutt.hour:t.minute:t.sect1.hourt1.minutet1.sec;/定义对象定义对象t1/调用函数,为对象调用函数,为对象t1的成员输入数据的成员输入
51、数据/调用函数,输出对象调用函数,输出对象t1的数据的数据/定义对象定义对象t2提饱谩衙凛扑控裁舆谎契舀别淋菊纱徐惩薯毖浦诧捅体倔蔑克活漾拜瞥罪第2讲类和对象第2讲类和对象8.6 类和对象的简单应用举例例例5c5c、引用多个对象的成员(、引用多个对象的成员(P257P257例例8.28.2程序程序c c) 程程序序c c对对上上面面的的程程序序进进行行修修改改,使使得得数数据据成成员员的的值值不不再再由由键键盘盘输输入入,而而是是在在调调用用函函数数时时由由实实参参提提供供,并并在在函函数数中中使使用用了了默认参数。默认参数。例例5d5d、用含有成员函数的类来改写程序(、用含有成员函数的类来改
52、写程序(P258P258例例8.38.3)泉锭谊阁腥脊氮栋喝侈贩韧冬昨巢穷位霍讳沈缺媳少倍盘示佳棠绵枣霞羡第2讲类和对象第2讲类和对象例例5d、用含有成员函数的类改写程序(、用含有成员函数的类改写程序(P258例例8.3)#includeusingnamespacestd;classTimepublic:voidset_time();voidshow_time();private:inthour,minute,sec;intmain()Timet1;t1.set_time();t1.show_time();Timet2;t2.set_time();t2.show_time();return0;
53、voidTime:set_time()cinhourminutesec;voidTime:show_time()couthour:minute:sec;有有2 2个公有成员函数个公有成员函数声明成员函数声明成员函数有有3 3个私有的数据成员个私有的数据成员在类外定义成员函数在类外定义成员函数注意:成员函数可直接引用数据成员注意:成员函数可直接引用数据成员定义定义TimeTime类对象类对象t1t1调用对象调用对象t1t1的成员函数的成员函数set_timeset_time, 为为t1t1的数据成员输入数据的数据成员输入数据调用对象调用对象t1t1的成员函数的成员函数show_timeshow_
54、time, 输输出出t1t1的数据成员值的数据成员值调用对象调用对象t2t2的成员函数的成员函数set_timeset_time, 为为t2t2的数据成员输入数据的数据成员输入数据调用对象调用对象t2t2的成员函数的成员函数show_timeshow_time, 输输出出t2t2的数据成员值的数据成员值定义定义TimeTime类对象类对象t2t2几点注意:几点注意:1.1.在在mainmain中中调调用用成成员员函函数数时时,应应指指定定 对象名对象名2.2.当当调调用用t1.set_time()t1.set_time()时时,引引用用的的是是t1t1的数据成员的数据成员3.3.在在类类外外定
55、定义义成成员员函函数数时时,应应指指定定作作用用域(类名)域(类名)典山粹皿精扒躺昔琢鲜功看茬缝韵坷距砧槽援雨熟夺矣钠障眉嫂饺姑绵竹第2讲类和对象第2讲类和对象8.6 类和对象的简单应用举例例例6 6、找出一个整型数组中的最大元素(、找出一个整型数组中的最大元素(P259P259例例8.48.4) 这里使用类来处理。这里使用类来处理。#includeusingnamespacestd;classArray_maxpublic:voidset_value();voidmax_value();voidshow_value();private:intarray10;intmax;voidArray_
56、max:set_value()for(inti=0;iarrayi;voidArray_max:max_value()max=array0;for(inti=1;imax)max=arrayi;voidArray_max:show_value()coutmax=max;intmain()Array_maxarrmax;arrmax.set_value();arrmax.max_value();arrmax.show_value();return0; 可可以以看看出出,主主函函数数十十分分简简单单,只只需需调调用用有有关关对对象象的的成成员员函函数,以完成相应的操作。数,以完成相应的操作。 在在
57、面面向向对对象象的的程程序序设设计计中中,最最关关键键的的工工作作是是类类的的设设计计,所所有的数据和对数据的操作都体现在类中。有的数据和对数据的操作都体现在类中。淹鸟泻以味雹率颜茶口墓姆砌磊婿尘刊蒋吵拦谦农冕预崖剩员匙只击夜万第2讲类和对象第2讲类和对象例6 6、找出一个整型数组中的元素的最大值、找出一个整型数组中的元素的最大值#includeusingnamespacestd;classArray_maxpublic:voidset_value();voidmax_value();voidshow_value();private:intarray10;intmax;voidArray_ma
58、x set_value()inti;for(i=0;iarrayi;voidArray_max max_value()inti;max=array0;for(i=1;imax)max=arrayi;voidArray_max show_value()coutmax=max;intmain()Array_maxarrmax;arrmax.set_value();arrmax.max_value();arrmax.show_value();return0;/声明类声明类/以下以下3 3行为成员函数原型声明行为成员函数原型声明/对数组元素设置值对数组元素设置值/找出数组中的最大元素找出数组中的最大元
59、素/输出最大值输出最大值/整型数组整型数组/成员函数定义,向数组元素输入数值成员函数定义,向数组元素输入数值/成员函数定义,找数组元素中的最大值成员函数定义,找数组元素中的最大值/定义对象定义对象arrmax/调用调用arrmax的的set_value函函数,向数组元素输入数值数,向数组元素输入数值/调用调用arrmaxarrmax的的max_valuemax_value函数,函数,找出数组元素中的最大值找出数组元素中的最大值/调用调用arrmaxarrmax的的show_valueshow_value函函数,输出数组元素中的最大值数,输出数组元素中的最大值/成员函数定义,输成员函数定义,输出
60、最大值出最大值痘违松使腑忙骆刮楷偏簧楔孟瘩拜患抛博渍骇机鳖稳捉峪重幽朵箩撇碱褐第2讲类和对象第2讲类和对象8.6 类和对象的简单应用举例例例7 7、使用类设计模仿数字式时钟的程序使用类设计模仿数字式时钟的程序(1 1)函函数数mainmain()能能使使用用对对象象clockAclockA和和clockBclockB,但但是是不不能能访访问对象内部私有的数据成员和成员函数。问对象内部私有的数据成员和成员函数。(2 2)只只要要定定义义了了类类,就就可可以以建建立立多多个个对对象象,并并且且这这些些对对象象之之间不会相互干扰。间不会相互干扰。炎类伏健孪捷堑掖伙赤应哩据腋昌询丁削咏奢醒郎侗冉榴肢兆
61、介道加川瘴第2讲类和对象第2讲类和对象8.6 8.6 类的封装性和信息隐蔽类的封装性和信息隐蔽n公用接口与私有实现的分离公用接口与私有实现的分离 classStudentprivate:intnum;stringname;charsex;public:voiddisplay()coutnum:numendl;coutname:nameendl;coutsex:sexendl;Studentstud;被操作的数据是私有的被操作的数据是私有的公用接口公用接口intage;(1)如果想修改或扩充类的功)如果想修改或扩充类的功能,只需修改本类中有关的数据能,只需修改本类中有关的数据成员和与它有关的成员
62、函数,程成员和与它有关的成员函数,程序中类外的部分可以不必修改。序中类外的部分可以不必修改。coutage:ageendl;注意:虽然类中的数据成员改变了,注意:虽然类中的数据成员改变了,成员函数成员函数display的定义改变了,但的定义改变了,但是类的对外接口没有改变,外界仍是类的对外接口没有改变,外界仍然通过公用的然通过公用的display函数访问类中函数访问类中的数据。程序中的其他任何部分均的数据。程序中的其他任何部分均无需修改。无需修改。当接口与实现(对数据的操作)分当接口与实现(对数据的操作)分离时,只要类的接口没有改变,对离时,只要类的接口没有改变,对私有实现的修改不会影响程序的
63、其私有实现的修改不会影响程序的其他部分。他部分。(2) (2) 如果在编译时发现类中的数如果在编译时发现类中的数据读写有错,不必检查整个程序,据读写有错,不必检查整个程序,只需检查本类中访问这些数据的只需检查本类中访问这些数据的少数成员函数。少数成员函数。巡鹏石撵蚁欣俐姬碾专算刊缆杉抱臀烫子萤射蜡唐祁纪疚擞驯迎夏驴糯戊第2讲类和对象第2讲类和对象8.6 8.6 类的封装性和信息隐蔽类的封装性和信息隐蔽n类声明和成员函数定义的分离类声明和成员函数定义的分离n如如果果一一个个类类被被多多个个程程序序使使用用,一一般般做做法法是是将将类类的的声声明明( (其其中中包包含含成成员员函函数数的的声声明明
64、) )放放在在指指定定的的头头文文件件中中,用用户户如如果果想想用用该该类类,只只要要把把有有关关的的头头文文件件包包含含进进来来即即可可,不不必必在在程程序序中中重重复复书书写写类类的的声声明明,减减少少工工作作量量,提高编程的效率。提高编程的效率。/student.h(这是头文件,在此文件中进行类的声明这是头文件,在此文件中进行类的声明)classStudentpublic:voiddisplay();private:intnum;charname20;charsex; /类声明类声明/公用成员函数原型声公用成员函数原型声明明/student.cpp(在此文件中进行函数的定义在此文件中进行
65、函数的定义)#include#includestudent.h voidStudent display()coutnum:numendl;coutname:nameendl;coutsex:sexendl;/不要漏写此行,否不要漏写此行,否则编译通不过则编译通不过/在类外定义在类外定义display类函数类函数涂声扮度蹈室住秦卑赵康梢丘涎瓤返亏煞纺纶脊控穆峨象幻捍烙双景综享第2讲类和对象第2讲类和对象8.6 8.6 类的封装性和信息隐蔽类的封装性和信息隐蔽n为为了了组组成成一一个个完完整整的的源源程程序序,还还应应当当有有包包括括主函数的源文件:主函数的源文件: /main.cpp主函数模块主
66、函数模块#include#includestudent.h/将将类类声声明明头头文文件件包包含含进进来来intmain()Studentstud;/定义对象定义对象stud.display();/执行执行stud对象的对象的display函数函数return0;这是一个包括这是一个包括3个文件的程序,组成两个文件模块:个文件的程序,组成两个文件模块:一个是一个是主模块主模块main.cpp,一个是,一个是student.cpp。在主模块中又包含头。在主模块中又包含头文件文件student.h。在预编译时会将头文件。在预编译时会将头文件student.h中的内容取中的内容取代代#includes
67、tudent.h行。行。证诬筷耪诛波佰绒说斗残舟袱波承岁键毡灼阿微倍挎声狞父址盟箔缆烫盟第2讲类和对象第2讲类和对象8.6 8.6 类的封装性和信息隐蔽类的封装性和信息隐蔽n注注意意:由由于于将将头头文文件件student.hstudent.h放放在在用用户户当当前前目目录录中中,因因此此在在文文件件名名两侧用双撇号包起来两侧用双撇号包起来“student.h student.h ”) )而不用尖括号而不用尖括号()()C+C+编译系统对两个文件编译系统对两个文件main.cppmain.cpp和和student.cppstudent.cpp分别进行编译分别进行编译得到两个目标文件得到两个目标
68、文件main.objmain.obj和和tudent.objtudent.obj得到两个目标文件得到两个目标文件main.objmain.obj和和tudent.objtudent.objC+C+编译系统对两个文件编译系统对两个文件main.cppmain.cpp和和student.cppstudent.cpp分别进行编译分别进行编译彩郸纠窟炭宫啸岸她替鳖詹墨浓凹蛇伦脓躬了蜜竖只剔抄漫咋味鸣欧暇汕第2讲类和对象第2讲类和对象8.6 8.6 类的封装性和信息隐蔽类的封装性和信息隐蔽n在在实实际际工工作作中中,并并不不是是将将一一个个类类声声明明做做成成一一个个头头文文件件,而而是是将将若若干干个
69、个常常用用的的功功能能相相近近的的类类声声明明集集中中在在一一起起,形形成成类类库。库。n类类库库有有两两种种: 一一种种是是C+C+编编译译系系统统提提供供的的标标准准类类库库;一一种种是是用用户户根根据据自自己己的的需需要要做做成成的的用用户户类类库库,提提供供给给自自己己和和自自己授权的人使用,这称为自定义类库。己授权的人使用,这称为自定义类库。n类库包括两个组成部分:类库包括两个组成部分: (1) (1)类声明头文件;类声明头文件; (2) (2)已经过编译的成员函数的定义,它是目标文件。已经过编译的成员函数的定义,它是目标文件。 用用户户只只需需把把类类库库装装入入到到自自己己的的计
70、计算算机机系系统统中中( (一一般般装装到到C+C+编编译译系系统统所所在在的的子子目目录录下下) ),并并在在程程序序中中用用#include#include命命令令行行将将有有关关的的类类声声明明的的头头文文件件包包含含到到程程序序中中,就就可可以以使使用用这些类和其中的成员函数,顺利地运行程序。这些类和其中的成员函数,顺利地运行程序。辅寓颧病诽差湿厘毫做以澎夸腮泡膜菠疼枫慨与捧告逼霞渠彩羞偏婶芦迷第2讲类和对象第2讲类和对象补充内容(自学)?:全局作用域限定符“:” #include #include using namespace std;using namespace std;int
71、 X=1;int X=1;void main()void main() int X=2; int X=2; cout X; cout X; 此此时时输输出出的的X X值值是是为为“1 1”还是还是“2 2”? 输出:输出:2 2因因为为系系统统采采用用同同名名覆覆盖原则。盖原则。如如何何输输出出全全局局变变量量X X的的值?值?相同吗?凋袒页铅取营丘妆拔溅枷妙沽茵华赏禹邵锡户梭佰膊诗炼伴率败矿币藉舷第2讲类和对象第2讲类和对象C+中的全局作用域限定符 例题:全局作用域例题:全局作用域#includeusingnamespacestd;intX=1;voidmain()intX=2;coutlo
72、calX=Xendl;/未限定时的符号名为局部符号名未限定时的符号名为局部符号名cout“globalX=”:Xendl;/采用采用“:”限定时的符号名为全局符号名限定时的符号名为全局符号名全全 局局 作作 用用 域域 限限 定定 符符“:”的作用的作用: 能使程序员访问到在某外部块中所定义的全局变量,以免被同名的局部变量所覆盖。访问规则:访问规则: (1)有“:”限定的同名符号是全局变量。 (2)无“:”限定的同名符号是局部变量。厩搁该沥饭舅民桅绥坤丑八小贵砧忘承狠拄鸳旋拼持狄逮炎界牢胯执翟呈第2讲类和对象第2讲类和对象全局作用域限定符的编程规则全局作用域限定符的编程规则:CreateWin
73、dow(:CreateWindow(参数参数) );CreateWindow(CreateWindow(参数参数) );n全全局局作作用用域域限限定定符符“:”不不仅仅可可以以限限定定变变量量,也也可可以以用用来来限限定函数。定函数。n以以Microsoft Microsoft 公公司司的的SDK SDK APIAPI函函数数与与VC+VC+中中的的MFCMFC类类库库中中的的成成员函数同名为例说明员函数同名为例说明它为它为MFC CWndMFC CWnd类中类中的成员函数!的成员函数!它为它为Windows APIWindows API全局函数全局函数呐峻乾畴牙躬检痉毅晰园衫酬勾遭崭迎蒜府正
74、豫威慕坟梨饺席牧停皂芋爷第2讲类和对象第2讲类和对象面向对象的程序设计方法 在在C+C+中中,每每个个对对象象都都是是由由数数据据和和函函数数(即即操操作作代代码码)这这两部分组成。两部分组成。数据数据函数函数对对象象数据用来描述对象的数据用来描述对象的“属性属性” 函数用来对数据进行操作,函数用来对数据进行操作,实现对象的实现对象的“行为行为” 对于三角形对象,对于三角形对象,n 它的它的3 3个边长就是它的属性个边长就是它的属性n 计算三角形面积和输出有关数据就是它的行为(计算三角形面积和输出有关数据就是它的行为(方法方法)步但尊譬会耐擅钉剧围滞饥捶眠苑切敖梨面墟荔笆谎敷泊对马邑撰扮吏乏第
75、2讲类和对象第2讲类和对象翱编辞状杏象攫辨殆夷绑徐煮桂虏烙实誉若造脑漏材壁鸵驻览默姆潭懂污第2讲类和对象第2讲类和对象C+程序设计第第8章章 类和对象类和对象课后作业与上机练习题目课后作业与上机练习题目短执迫兆蓉镁铂砰订孺啡亮买替忍矽希掳撮木厌颁井声呆涪殆叉辟豌坛之第2讲类和对象第2讲类和对象本章作业1.分析下列程序的输出结果分析下列程序的输出结果(1)#includeusingnamespacestd;classLocationpublic:voidinit(inti=0,intj=0);voidsetA(intn1)A=n1;voidsetB(intn2)B=n2;intgetA()ret
76、urnA;intgetB()returnB;private:intA,B;voidLocation:init(inti,intj)A=i;B=j; intmain()LocationX,Y;X.init(4);X.setA(10);coutX.getA(),X.getB()endl;Y.init(7,9);Y.setB(8);coutY.getA(),Y.getB()endl;return0;言蘑誓势墙酉楞捉搁儒烘叙皱敌彪容恬禹熔绘鬼另闭伎壬铭欠萤踢兵汞倦第2讲类和对象第2讲类和对象本章作业(2)下面的程序定义了一个下面的程序定义了一个ClockClock类,记录当前时间(小时和分钟),并可以
77、类,记录当前时间(小时和分钟),并可以通过两个函数取到这两个私有成员。主函数定义一个通过两个函数取到这两个私有成员。主函数定义一个ClockClock对象,输出对象,输出他的当前时间,然后将时间增加一分钟,再输出增加后的时间。写出他的当前时间,然后将时间增加一分钟,再输出增加后的时间。写出程序运行结果。程序运行结果。#includeusingnamespacestd; classclockinthour;intminute;public:clock(void);voidinc_time(void);intpresent_hour(void)returnhour;intpresent_minut
78、e(void)returnminute;voidprint_time();clock:clock(void)hour=6;minute=59;坦险巡速皿檬饥星漓再嫁餐蛛雏锹猫淋措祥蒙腕裸嗡香臆氖洪氓方扦虫杯第2讲类和对象第2讲类和对象本章作业voidclock:print_time(void)coutNow,thetimeis:hour:;if(minute10)cout0;coutminute59)minute-=60;hour+;intmain()clockmyclock;myclock.print_time();myclock.inc_time();myclock.print_time(
79、);myclock.inc_time();myclock.print_time();return0;雷早嗡搜专渍抗殊韭歪北象齿貌尔眷谗帕砒肺烤虱擞粹柬佩犁潭悉虱中剑第2讲类和对象第2讲类和对象本章作业2. 2. 设计设计TestTest类,使如下程序的输出结果为:类,使如下程序的输出结果为: 测试结果:测试结果:68-55=1368-55=13intmain()Testa;a.init(68,55);a.print();return0;时米柳箭甘颐省员痹写变肛省显砖腻趋巍耍蚁劈晕帖船廉米烘蛮煮陨佃转第2讲类和对象第2讲类和对象本章作业3. 3. 改错题改错题(1)请用横线标出下面的程序错误语句
80、所在行并说明出错原因请用横线标出下面的程序错误语句所在行并说明出错原因。#includeusingnamespacestd;classAprivate:inta;public:voidseta(intx)a=x;voidshowA()couta=aendl;intmain()Aobj;obj.a=3;obj.seta(53);obj.showA();return0; 八黑漠辞邦其寿瓶酝让赡翘市让想磺矗时娩衣尾肋顷奸秧坦敢榆异症溺傻第2讲类和对象第2讲类和对象本章作业(2)请用横线标出下面的程序段错误语句所在行并说明出错原请用横线标出下面的程序段错误语句所在行并说明出错原因。因。classLoc
81、ationintX,Y=20;private:intlength,height;public:floatradius;voidinit(intinitX,intinitY);intGetX();intGetY();筒奶汤渡泛讳霓吩烹衣邻靠妇畔亥聂州肯拜座瑟飘漫铜循潜升乾谐浩相冬第2讲类和对象第2讲类和对象本章作业4.4.填空题填空题(1 1)在下面程序的横线处填上适当字句,使该程序执行结果为)在下面程序的横线处填上适当字句,使该程序执行结果为8 8。#include #include class Myclass class Myclass int X;int X; public: public
82、: (1) (1) / / 为为X X置值置值 (2) (2) / / 取取X X值值;int main()int main() Myclass test; Myclass test; test.init(8); test.init(8); couttest.Getnum()endl; couttest.Getnum()endl; return 0; return 0; 暖擒云殉歉撬嘱芋佛披长纲丹监务癣糯瞪粪沂中竖允塌炸堰膏聪政聂嘲伶第2讲类和对象第2讲类和对象本章作业(2 2)在下面的类定义中,私有成员包括)在下面的类定义中,私有成员包括 。classLocationintX,Y;prote
83、cted:intW,Z;intSet(W,Z);private:intlength,height;public:voidinit(intx,inty);intGetX();intGetY();吻婉恒聂畜汤卜掖乔尸吕糊埠祟孔更丈郡跪噎茹捐焊舱鸡心挨嗜堕玄扳亩第2讲类和对象第2讲类和对象本章作业3. 3. 课后习题课后习题1. P261-11. P261-12. P261-22. P261-2,3 33. P261-43. P261-4,5 5壳斑寓绍纪疑妨脱芭躇靴堰鼎俏匪浸铱嚼莲叙棒店鹰荫屁便扫伎抢娘拉埋第2讲类和对象第2讲类和对象上机练习题目n实验目的实验目的n通过过上机练习学会类和对象的定义
84、方法。通过过上机练习学会类和对象的定义方法。n了解下列各成员函数的特点:了解下列各成员函数的特点: (1)内联)内联 (2)重载)重载 (3)设置默认参数)设置默认参数刁球芭掺歉争豫潍告元儡鹃啊瞳塞莉梁散慢巡爱磁睹烙破舍嘎列撵选生悔第2讲类和对象第2讲类和对象上机练习题目(一)教材中例题程序的调试(一)教材中例题程序的调试1. 例例8.12. 例例8.2 (1)程序)程序a ( 2)程序)程序b (3)程序)程序c3. 例例8.38.44. p258例题例题薛霓犁傻渝澈柠绒却懦芥扫循眠碉纽已譬溢淀吻舷喊滓烦郎括哗廊泻狐厂第2讲类和对象第2讲类和对象上机练习题目(二)课件中典型例题程序的调试(二
85、)课件中典型例题程序的调试1. 计算两数之和。计算两数之和。 (两数之和(两数之和2.cpp)2.例例1.日期类的定义和应用日期类的定义和应用(例(例1日期类日期类.cpp.cpp)3. 例例8.3(例(例8_3.cpp)4. 例例4.使使用用类类设设计计模模拟拟数数字字式式时时钟钟的的程程序序(例例4模模拟拟数字时钟数字时钟.cpp)罚俐恳像叉流寨朽跌蛮莲赎雇耸振抨戒挤汀掇涝具陕倒犬悼漠骚寇硒依盏第2讲类和对象第2讲类和对象上机练习题目(四)课后习题(四)课后习题1. p216第第23题题2. p127第第46题题忿嵌炎窄雾聂锡刁饺殃痰徊扯耀狗楔犬漫西愧浮漆如寂捏巧卯命酒第晚佑第2讲类和对象第2讲类和对象