




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第五章第五章类与对象的深入介绍类与对象的深入介绍参见教材参见教材5.4、5.5、5.6、5.7节节2主要内容及要求主要内容及要求l主要内容主要内容l类与对象概述类与对象概述 l构造函数和析构函数构造函数和析构函数 l静态成员和常量成员静态成员和常量成员 l友元友元 l要求要求l重点掌握类、对象、构造函数、析构函数、静态成员、重点掌握类、对象、构造函数、析构函数、静态成员、常量成员常量成员 l了解友元的使用了解友元的使用 3设计实例设计实例l以一个例子进一步比较以一个例子进一步比较面向对象面向对象程序设计程序设计思想与思想与非面向对象非面向对象程序设计思想,展示从程序设计思想,展示从不使用函数
2、到引入函数进行模块化编程,不使用函数到引入函数进行模块化编程,再到引入类进行面向对象编程的程序设计再到引入类进行面向对象编程的程序设计思路思路 4例例:桌球城计费问题:桌球城计费问题 l问题描述:问题描述: 某桌球城营业时间为某桌球城营业时间为9:00到到23:00,每张桌,每张桌子收费标准为子收费标准为9:00到到18:00或或21:00至至23:00为为0.45元分钟、元分钟、18:00至至21:00为为0.60元元分钟。编写分钟。编写C+程序,输入顾客占用一程序,输入顾客占用一张桌子的起、止时间(精确到分钟),输张桌子的起、止时间(精确到分钟),输出计费结果。出计费结果。 5非模块化设计
3、非模块化设计 l按照自顶向下分解的思路,首先可将此问按照自顶向下分解的思路,首先可将此问题分解成几个小问题:题分解成几个小问题:l输入起止时间输入起止时间l根据起止时间计算费用根据起止时间计算费用l输出费用输出费用6非模块化设计(续)非模块化设计(续)l输出费用使用简单的输出语句即可输出费用使用简单的输出语句即可l输入起止时间,也可使用简单的输入语句,输入输入起止时间,也可使用简单的输入语句,输入两个整数分别代表小时和分钟两个整数分别代表小时和分钟l为使程序能应付所有情况,要检查用户输入的小为使程序能应付所有情况,要检查用户输入的小时和分钟是否正确,检查包括时和分钟是否正确,检查包括l输入的小
4、时应大于等于输入的小时应大于等于9 9小于等于小于等于2323,且如果等于,且如果等于2323时时分钟应该为分钟应该为0 0l输入的分钟应大于等于输入的分钟应大于等于0 0小于等于小于等于5959l输入的起始时间应小于(先于)终止时间输入的起始时间应小于(先于)终止时间 7非模块化设计(续)非模块化设计(续)l进一步考虑如何根据起止时间进行计费进一步考虑如何根据起止时间进行计费l显然,因为不同时间段的收费标准不同,需要分时间显然,因为不同时间段的收费标准不同,需要分时间段计算费用段计算费用l可以根据起止时间求出每个时间段的分钟数,然后使可以根据起止时间求出每个时间段的分钟数,然后使用该分钟数乘
5、相应的费用则可得到总费用用该分钟数乘相应的费用则可得到总费用l因为只有从因为只有从18点到点到21点的费用不同,因此也可先求出点的费用不同,因此也可先求出总的分钟数乘一般费用(即总的分钟数乘一般费用(即0.45元),然后再求用户元),然后再求用户在在18点到点到21点这个范围内占用了多少分钟,用它乘超点这个范围内占用了多少分钟,用它乘超出费用(即出费用(即0.15元),两个费用相加即得到总费用元),两个费用相加即得到总费用8非模块化设计的源代码非模块化设计的源代码/ 程序:程序:CALFEE1.CPP/ 功能:为某桌球城计算费用(第一个版本,所有功能都用主函数功能:为某桌球城计算费用(第一个版
6、本,所有功能都用主函数main()实实现)现)#include int main() int start_hour, start_minute; / 输入的起始时间输入的起始时间 int temp_s_hour, temp_s_minute; / 用来计算附加时间的临时起始时间用来计算附加时间的临时起始时间 int end_hour, end_minute; / 输入的终止时间输入的终止时间 int temp_e_hour, temp_e_minute; / 用来计算附加时间的临时终止时间用来计算附加时间的临时终止时间 int total_minute;/ 从起始时间到终止时间总的分钟数从起始
7、时间到终止时间总的分钟数 int extra_minute;/ 在在18点到点到21点时间段要计算附加费用的分钟数点时间段要计算附加费用的分钟数 float total_fee;/ 总的费用总的费用9非模块化设计的源代码(续)非模块化设计的源代码(续) while (1) / 可多次输入终止和起始时间,多次计算费用可多次输入终止和起始时间,多次计算费用 / / 输入两个整数分别代表小时与分钟,中间用空格分开输入两个整数分别代表小时与分钟,中间用空格分开 cout Please input the start time (such as 12 20): ;cout start_hour star
8、t_minute; cin start_hour start_minute; / / 如果用户的小时与分钟都为零,则结束程序如果用户的小时与分钟都为零,则结束程序 if (start_hour = 0 & start_minute = 0) return 0;if (start_hour = 0 & start_minute = 0) return 0; cout Please input the end time: ; cout end_hour end_minute; cin end_hour end_minute; 10非模块化设计的源代码(续)非模块化设计的源代码(续) / 检查输入的
9、起始时间和终止时间是否合法检查输入的起始时间和终止时间是否合法 if (start_hour = 23) / 起始的小时必须在起始的小时必须在9到到22之间之间cout The start hour is error!n;continue; if (start_minute 59) / 分钟必须在分钟必须在0到到59之间之间cout The start minute is error!n;continue; if (end_hour 23) / 终止的小时必须在终止的小时必须在9到到23之间之间cout 0) cout The end time is error!n;continue;/ 分钟
10、必须在分钟必须在0到到59之间之间if (end_minute 59) cout The end minute is error!n;continue;12非模块化设计的源代码(续)非模块化设计的源代码(续) / 计算总的时间(分钟数)计算总的时间(分钟数) total_minute = (end_hour - start_hour) * 60 + end_minute - start_minute; / / 如果总的分钟数小于如果总的分钟数小于0,0,则表示输入的起始时间大于终止时间则表示输入的起始时间大于终止时间 if (total_minute 0) cout The start tim
11、e is later than the end time!n;continue; 13非模块化设计的源代码(续)非模块化设计的源代码(续)/ 计算输入的起始时间和终止时间落在计算输入的起始时间和终止时间落在18点到点到21点时间段的分钟数,点时间段的分钟数,/这段时间要计附加费用这段时间要计附加费用 if (end_hour=21)extra_minute=0; else if (start_hour = 18) / 如果起始小时在如果起始小时在18点以后,点以后, / 则落在则落在18点到点到21点之间的起始小时就是输入的起始小时点之间的起始小时就是输入的起始小时 temp_s_hour =
12、 start_hour; temp_s_minute = start_minute; else / 否则(输入的起始小时在否则(输入的起始小时在18点以前)从点以前)从18点算起点算起if (end_hour=18) temp_s_hour = 18; temp_s_minute = 0; 14非模块化设计的源代码(续)非模块化设计的源代码(续) if (end_hour 21) / 同样如果终止小时在同样如果终止小时在21点以前,点以前,/ 则落在则落在18点到点到21点之间的终止小时就是输入的终止小时点之间的终止小时就是输入的终止小时temp_e_hour = end_hour; temp
13、_e_minute = end_minute; else / 否则(输入的终止小时在否则(输入的终止小时在21点以后)只能算到点以后)只能算到21点点temp_e_hour = 21; temp_e_minute = 0; extra_minute = (temp_e_hour - temp_s_hour) * 60 + temp_e_minute temp_s_minute;15非模块化设计的源代码(续)非模块化设计的源代码(续)/ 计算总费用计算总费用total_fee = total_minute * 0.45 + extra_minute * 0.15;/ 输出总费用输出总费用cout
14、 From start_hour : start_minute;cout to end_hour : end_minute , ;cout The total fee is: total_fee n; 16非模块化设计的不足及改进非模块化设计的不足及改进l上述解决方案没有进行模块化设计,所以程序上述解决方案没有进行模块化设计,所以程序重重用的可能性很小用的可能性很小,要,要扩充也不容易扩充也不容易l为提高程序的可重用性,可为提高程序的可重用性,可将其中容易被重用的将其中容易被重用的功能分离出来,形成独立的模块功能分离出来,形成独立的模块l上述程序的核心功能是根据不同时间段的计费标准求上述程序的
15、核心功能是根据不同时间段的计费标准求每个起止时间的费用。而上述程序还有输入合法性检每个起止时间的费用。而上述程序还有输入合法性检查、计算两个时间之间的分钟数等与核心功能关系不查、计算两个时间之间的分钟数等与核心功能关系不密切的一些功能,这些功能被重用的机会比较大密切的一些功能,这些功能被重用的机会比较大17非模块化设计的不足及改进(续)非模块化设计的不足及改进(续)l进一步思考程序哪些地方有需要扩充的可进一步思考程序哪些地方有需要扩充的可能性能性l改变时间段(可能性较大)改变时间段(可能性较大)l根据需要增加一些收不同费用的时间段根据需要增加一些收不同费用的时间段l改变时间段的费用改变时间段的
16、费用ll将时间的计算精确到秒(可能性较小)将时间的计算精确到秒(可能性较小) 18使用函数作为模块的设计使用函数作为模块的设计 l根据上述分析,可设计如下一些函数:根据上述分析,可设计如下一些函数:/ ROUTINE: check_time/ ROUTINE: check_time/ FUNCTION: / FUNCTION: 检查时间是否合法检查时间是否合法/ PARAMETER: hour/ PARAMETER: hour小时,小时,minuteminute分钟分钟/ RETURN: / RETURN: 如果合法则返回如果合法则返回1 1,否则返回,否则返回0 0int check_tim
17、e(int hour, int minute);int check_time(int hour, int minute); 注:该函数被重用的机会较大,为保证其可重用性,该函数应该只检查具注:该函数被重用的机会较大,为保证其可重用性,该函数应该只检查具有通用性的合法性,即该函数只检查小时有通用性的合法性,即该函数只检查小时hourhour是否在是否在0 0到到2424之间。这里将之间。这里将合法性检查分成两部分,把与本问题密切相关的合法性检查(检查合法性检查分成两部分,把与本问题密切相关的合法性检查(检查hourhour是否在是否在9 9到到2323之间)放在上层程序中进行。之间)放在上层程序
18、中进行。 19使用函数作为模块的设计使用函数作为模块的设计 (续)(续)/ ROUTINE: calculate_minutes/ ROUTINE: calculate_minutes/ FUNCTION: / FUNCTION: 计算两个时间之间的分钟数计算两个时间之间的分钟数/ PARAMETER: start_hour, start_minute / PARAMETER: start_hour, start_minute 起始时间起始时间/ / (小时和分钟)(小时和分钟)/ end_hour, end_minuteend_hour, end_minute终止时间(小时和分钟)终止时间(
19、小时和分钟)/ REQUIRE: / REQUIRE: 起始时间和终止时间都合法起始时间和终止时间都合法/ RETURN: / RETURN: 返回两个时间之间的分钟数,若起始时间大于终止时间则返回负返回两个时间之间的分钟数,若起始时间大于终止时间则返回负数数 int calculate_minutes(int calculate_minutes( int start_hour, int start_hour, int start_minute, int start_minute, int end_hour, int end_hour, int end_minute ); int end_mi
20、nute );注:该函数被重用的机会较大注:该函数被重用的机会较大20使用函数作为模块的设计使用函数作为模块的设计 (续)(续)/ROUTINE: get_minutes/FUNCTION: 计算某个起止时间(由计算某个起止时间(由start_hour, start_minute/ end_hour, end_minute确定)在某个时间段(由确定)在某个时间段(由min_hour, / min_minute, max_hour, max_minute确定)中的分钟数确定)中的分钟数/PARAMETER: min_hour, min_minute 时间段的最小时间(起始时间)时间段的最小时间(
21、起始时间)/ max_hour, max_minute时间段的最大时间(终止时间)时间段的最大时间(终止时间)/ start_hour, start_minute待计算的起始时间待计算的起始时间/ end_hour, end_minute待计算的终止时间待计算的终止时间 / REQUIRE: 所有的时间都合法,且所有终止时间都大于相应的起始时间所有的时间都合法,且所有终止时间都大于相应的起始时间/ RETURN: 返回计算出来的分钟数。返回计算出来的分钟数。int get_minutes( int min_hour, int min_minute, int max_hour, int max_
22、minute, int start_hour, int start_minute, int end_hour, int end_minute);21/ 程序:程序:CALFEE2.CPP/ 功能:为某桌球城计算费用(第二个版本,引入函数来实现所需的功能)功能:为某桌球城计算费用(第二个版本,引入函数来实现所需的功能)#include int check_time(int hour, int minute)if (hour 24) return 0;if (hour = 24 & minute != 0) return 0;if (minute 59) return 0;return 1;int
23、 calculate_minutes(int start_hour, int start_minute, int end_hour, int end_minute)return (end_hour - start_hour) * 60 + end_minute - start_minute;C+ codes22int get_minutes(int min_hour, int min_minute, int max_hour, int max_minute, int start_hour, int start_minute, int end_hour, int end_minute) int
24、temp_s_hour, temp_s_minute; int temp_e_hour, temp_e_minute; / 如果起始时间在时间段的终止时间之外(即没有落在时间段中)返回如果起始时间在时间段的终止时间之外(即没有落在时间段中)返回0 if (calculate_minutes(start_hour, start_minute, max_hour, max_minute) = 0) return 0; / 如果终止时间在时间段的起始之前(同样没有落在时间段中)返回如果终止时间在时间段的起始之前(同样没有落在时间段中)返回0 if (calculate_minutes(min_hou
25、r, min_minute, end_hour, end_minute) = 0) temp_s_hour = min_hour; temp_s_minute = min_minute; else temp_s_hour = start_hour; temp_s_minute = start_minute; minmaxstartend23 / 如果终止时间在时间段的终止时间之后,则只算到时间段的终止时间如果终止时间在时间段的终止时间之后,则只算到时间段的终止时间 if (calculate_minutes(max_hour, max_minute, end_hour, end_minute)
26、 = 0) temp_e_hour = max_hour; temp_e_minute = max_minute; else temp_e_hour = end_hour; temp_e_minute = end_minute; return calculate_minutes(temp_s_hour, temp_s_minute, temp_e_hour, temp_e_minute);C+ codes24int main()int start_hour, start_minute;int end_hour, end_minute;int total_minute;int extra_min
27、ute;float total_fee; while (1) cout start_hour start_minute; if (start_hour = 0 & start_minute = 0) return 0; cout end_hour end_minute; if (check_time(start_hour, start_minute) = 0) cout The start time is error!n;continue; / 额外的检查(与本问题密切相关的检查)额外的检查(与本问题密切相关的检查) if (start_hour = 23) cout The start ho
28、ur is error!n;continue; 25if (check_time(end_hour, end_minute) = 0) cout The end time is error!n;continue; / 额外的检查(与本问题密切相关的检查)额外的检查(与本问题密切相关的检查)if (end_hour 23) cout 0) cout The end time is error!n;continue;C+ codes26total_minute = calculate_minutes(start_hour, start_minute, end_hour, end_minute);
29、if (total_minute 0) cout The start time is later than the end time!n;continue; / 计算输入的起止时间落在时间段计算输入的起止时间落在时间段18点到点到21点之间的分钟数点之间的分钟数extra_minute = get_minutes(18, 0, 21, 0, start_hour, start_minute, end_hour, end_minute);total_fee = total_minute * 0.45 + extra_minute * 0.15;cout From start_hour : sta
30、rt_minute;cout to end_hour : end_minute , ;cout The total fee is: total_fee n; C+ codes27使用函数作为模块的设计使用函数作为模块的设计 (续)(续)l引入函数后,整个程序引入函数后,整个程序似乎似乎更复杂了,但实际上更复杂了,但实际上主函数相对简单了主函数相对简单了l在理解整个程序时,可先理解主函数,理解主函在理解整个程序时,可先理解主函数,理解主函数时并不需要关心它调用的函数的实现细节,只数时并不需要关心它调用的函数的实现细节,只需要知道它调用的每个函数的功能即可需要知道它调用的每个函数的功能即可;在;在
31、理解理解主函数后,再研究每个函数的实现细节主函数后,再研究每个函数的实现细节l总体总体而言而言,该程序比上一个程序更好理解,可重,该程序比上一个程序更好理解,可重用性和可扩充性也更好用性和可扩充性也更好 28使用函数模块的不足之处使用函数模块的不足之处l函数的参数可能过于复杂(?)函数的参数可能过于复杂(?)l单个函数功能过于简单单个函数功能过于简单 (?)(?)l代码复用(?):你觉得怎样?代码复用(?):你觉得怎样?29使用类作为模块的设计使用类作为模块的设计l根据问题的特征,容易想到使用时间类根据问题的特征,容易想到使用时间类TIME,根据要求解,根据要求解的问题可初步设计该类的界面为:
32、的问题可初步设计该类的界面为: class TIME public:/ ROUTINE: TIME/ FUNCTION: 构造函数,设置类中数据成员的初始值构造函数,设置类中数据成员的初始值/ PARAMETER: hour, minute待设置时间的小时和分钟,待设置时间的小时和分钟,/如果其值不是合法的时间,则将小时和分钟都置为如果其值不是合法的时间,则将小时和分钟都置为0./ ENSURE: 保证所设置的小时和分钟是合法的保证所设置的小时和分钟是合法的TIME(int hour = 0, int minute = 0);30使用类作为模块的设计(续)使用类作为模块的设计(续) / ROU
33、TINE: set_time / FUNCTION: 因为使用构造函数设置小时和分钟不能因为使用构造函数设置小时和分钟不能 / 报告传入的参数是否合法,所以提供本函数设置小报告传入的参数是否合法,所以提供本函数设置小 / 时和分钟,以便报告参数的合法性。时和分钟,以便报告参数的合法性。 / PARAMETER: hour, minute待设置时间的小时和分钟。待设置时间的小时和分钟。 / ENSURE: 保证所设置的小时和分钟是合法的保证所设置的小时和分钟是合法的 / RETURN: 如果传入的小时和分钟是合法的时间如果传入的小时和分钟是合法的时间 / 则返回则返回1,否则返回否则返回0int
34、 set_time(int hour, int minute);31使用类作为模块的设计(续)使用类作为模块的设计(续)/ ROUTINE: calculate_minutes/ FUNCTION: 计算从起始时间计算从起始时间start到当前对象到当前对象 / 所代表时间之间的分钟数所代表时间之间的分钟数 / PARAMETER: start起始时间起始时间 / RETURN: 两个时间之间的分钟数,若起始时两个时间之间的分钟数,若起始时 / 间大于终止时间则返回负数间大于终止时间则返回负数int calculate_minutes(const TIME& start);32使用类作为模块的
35、设计(续)使用类作为模块的设计(续)private:/ ROUTINE: check_time/ FUNCTION: 检查时间是否合法,用户使用的检查时间是否合法,用户使用的TIME类对象类对象 /都要保证是合法时间,因此将检查时间是否合法的功能设都要保证是合法时间,因此将检查时间是否合法的功能设 /计为私有,只在计为私有,只在TIME类自己的函数类自己的函数set_value()中调用,中调用, /保证所设置的时间合法。上层程序可通过检查是否设置保证所设置的时间合法。上层程序可通过检查是否设置 /时间成功而进行判断。时间成功而进行判断。 / PARAMETER: hour小时,小时,minu
36、te分钟分钟/ RETURN: 如果合法则返回如果合法则返回1,否则返回,否则返回0int check_time(int hour, int minute);int hour, minute; / 当前对象所代表的小时和分钟。当前对象所代表的小时和分钟。;33使用类作为模块的设计(续)使用类作为模块的设计(续)l计算某个起止时间在某个时间段中分钟数的函数计算某个起止时间在某个时间段中分钟数的函数get_minutes() 很难很难看成是某个看成是某个“时间时间”的行为,而应作为的行为,而应作为“时间段时间段”这样的对象上的这样的对象上的操作。因此不将它设计为时间类操作。因此不将它设计为时间类T
37、IME的成员函数,仍使用游离函数的成员函数,仍使用游离函数实现这项功能,该函数的界面如下:实现这项功能,该函数的界面如下: / ROUTINE: get_minutes / FUNCTION: 计算某个起止时间(由计算某个起止时间(由start和和end确定)在某个时确定)在某个时 / 间段(由间段(由min和和max 确定)中的分钟数确定)中的分钟数 / PARAMETER: min 时间段的最小时间、时间段的最小时间、max 时间段的最大时间时间段的最大时间 / start 待计算的起始时间、待计算的起始时间、end 待计算的终止时间待计算的终止时间 / REQUIRE: 所有终止时间都大
38、于相应的起始时间所有终止时间都大于相应的起始时间 / RETURN: 返回计算出来的分钟数。返回计算出来的分钟数。 int get_minutes(const TIME& min, const TIME& max, const TIME& start, const TIME& end); 34使用类作为模块的设计(续)使用类作为模块的设计(续)l为支持判断一个时间是否在另一时间之后,在类为支持判断一个时间是否在另一时间之后,在类TIME中增中增加如下成员函数:加如下成员函数: / ROUTINE: is_later_than / FUNCTION: 判断当前对象所代表的时间是否判断当前对象所代
39、表的时间是否 / 在时间在时间start之后。之后。 / PARAMETER: start所比较的起始时间所比较的起始时间 / RETURN: 如果当前对象所代表的时间在时间如果当前对象所代表的时间在时间 / start之后返回之后返回1,否则返回否则返回0. int is_later_than(const TIME& start);35使用类作为模块的设计(续)使用类作为模块的设计(续)l为了检查时间是否在某个特定的范围内,可将时间应满为了检查时间是否在某个特定的范围内,可将时间应满足的范围也作为类足的范围也作为类TIME的属性之一,因此为类的属性之一,因此为类TIME增增加如下数据成员:加
40、如下数据成员: int min_hour, min_minute;/ 时间范围的最小时间时间范围的最小时间 int max_hour, max_minute;/ 时间范围的最大时间时间范围的最大时间36使用类作为模块的设计(续)使用类作为模块的设计(续)l同时要增加成员函数,设置时间应满足的范围:同时要增加成员函数,设置时间应满足的范围: / ROUTINE: set_range / FUNCTION: 设置时间应该满足的范围设置时间应该满足的范围 / PARAMETER: min_hour, min_minute 时间范围的最小时间时间范围的最小时间 / max_hour, max_minu
41、te 时间范围的最大时间时间范围的最大时间 / RETURN: 如果设置成功则返回如果设置成功则返回1,否则返回否则返回0. int set_range(int min_hour, int min_minute, int max_hour, int max_minute);l在设置时间范围时应检查所设置的范围是否正确,包括在设置时间范围时应检查所设置的范围是否正确,包括l所传入的最小时间和最大时间是否合法所传入的最小时间和最大时间是否合法l所传入的最小时间是否小于最大时间所传入的最小时间是否小于最大时间l时间范围是否在时间范围是否在0 0点到点到2424点之间点之间l37/ 程序:程序:CAL
42、FEE3.H/ 功能:为某桌球城计算费用(第三个版本,引入类来实现所需的功能)功能:为某桌球城计算费用(第三个版本,引入类来实现所需的功能)class TIME public: TIME( int = 0 , int = 0 ); int set_range(int min_hour, int min_minute, int max_hour, int max_minute); int set_time(int hour, int minute); int get_hour() const; int get_minutes() const; int calculate_minutes(cons
43、t TIME& start) const; int is_later_than(const TIME& start) const;private: int check(int hour, int minute) const; int calculate(int start_hour, int start_minute, int end_hour, int end_minute ) const; int hour, minute; int max_hour, max_minute; int min_hour, min_minute; ;C+ codes38/ 程序:程序:CALFEE3.CPP/
44、 功能:为某桌球城计算费用(第三个版本,引入类来实现所需的功能)功能:为某桌球城计算费用(第三个版本,引入类来实现所需的功能)#include #include “CALFEE3.H”TIME:TIME( int hour, int minute )set_range(0, 0, 24, 0);if (check(hour, minute) = 0) hour = 0; minute = 0;TIME:hour = hour; TIME:minute = minute;C+ codes39int TIME: set_range(int min_hour, int min_minute, int
45、 max_hour, int max_minute) if (calculate(0, 0, min_hour, min_minute) 0) return 0; if (calculate(0, 0, max_hour, max_minute) 0) return 0; if (calculate(min_hour, min_minute, 24, 0) 0) return 0; if (calculate(max_hour, max_minute, 24, 0) 0) return 0; if (min_minute 59) return 0; if (max_minute 59) ret
46、urn 0; if (calculate(min_hour, min_minute, max_hour, max_minute) = 0) return 1; else return 0; int TIME: check(int hour, int minute) const if (minute 59) return 0;if (calculate(min_hour, min_minute, hour, minute) 0) return 0;if (calculate(hour, minute, max_hour, max_minute) 0) return 0;return 1; C+
47、codes42 int TIME:calculate(int start_hour, int start_minute, int end_hour, int end_minute ) const return (end_hour - start_hour) * 60 + end_minute - start_minute; C+ codes43int get_minutes (const TIME& min, const TIME& max, const TIME& start, const TIME& end )TIME temp_start, temp_end;if (start.is_l
48、ater_than(max) return 0;if (min.is_later_than(end) return 0;if (start.is_later_than(min) temp_start = start;else temp_start = min;if (end.is_later_than(max) temp_end = max;else temp_end = end;return temp_end.calculate_minutes(temp_start);C+ codes44#include “CALFEE3.H”int main()int hour, minute;TIME
49、start, end;TIME min(18, 0), max(21, 0);int total_minute;int extra_minute;float total_fee;start.set_range(9, 0, 23, 0);end.set_range(9, 0, 23, 0);while (1) / 输入起止时间输入起止时间cout hour minute;C+ codes45if (hour = 0 & minute = 0) return 0;if (start.set_time(hour, minute) = 0) cout The start time is error!n
50、;continue;cout hour minute;if (end.set_time(hour, minute) = 0) cout The end time is error!n;continue;total_minute = end.calculate_minutes(start);C+ codes46if (total_minute 0) cout The start time is later than the end time!n; continue;extra_minute = get_minutes(min, max, start, end);total_fee = total
51、_minute * 0.45 + extra_minute * 0.15;cout From start.get_hour() : start.get_minutes();cout to end.get_hour() :“ end.get_minutes() , ;cout The total fee is: total_fee -使用函数作为模块使用函数作为模块-使用类作为使用类作为模块。得到的程序似乎越来越复杂,但其结构却模块。得到的程序似乎越来越复杂,但其结构却是越来越清晰、越来越容易理解是越来越清晰、越来越容易理解l这种可理解性是指在不同层次的理解,通过引入这种可理解性是指在不同层次的
52、理解,通过引入函数,特别是引入类,将程序结构划分成不同层函数,特别是引入类,将程序结构划分成不同层次,每个层次上都更好理解,整个程序的结构也次,每个层次上都更好理解,整个程序的结构也更为清晰更为清晰l使用面向对象思想设计的程序具有更强的使用面向对象思想设计的程序具有更强的重用性重用性和和扩充性扩充性 48关于面向对象程序设计的若干基本问题关于面向对象程序设计的若干基本问题 l面向对象程序设计面向对象程序设计是一种是一种理念理念(idea):):思维和方法论思维和方法论的问的问题。题。是某种语言里面支持面对对象的是某种语言里面支持面对对象的具体机制具体机制:程序语言的运用程序语言的运用问题问题
53、-(类和对象、继承、多态性和模板(类和对象、继承、多态性和模板等)。等)。49抽象抽象 l生活在这个复杂的世界中,我们经常会生活在这个复杂的世界中,我们经常会借助借助“抽象抽象”来理解或解决很多事物。来理解或解决很多事物。 50抽象抽象l数据抽象数据抽象:只关心该数据:只关心该数据“是什么是什么”,而不关心它是如何运作的。而不关心它是如何运作的。l行为抽象行为抽象:只关心这个行为能够为我们:只关心这个行为能够为我们带来什么,而不关心这个行为的具体实带来什么,而不关心这个行为的具体实现方法。现方法。 51抽象抽象l在软件设计中,抽象早已证明是开发和管理在软件设计中,抽象早已证明是开发和管理大型复
54、杂项目的绝对大型复杂项目的绝对“必需品必需品”。例如下面。例如下面的计算就是用到了抽象:的计算就是用到了抽象: y = sin(x) + sqrt(x) ;l函数调用函数调用就是一种行为抽象:我们只关心个就是一种行为抽象:我们只关心个函数的功能,所以在决定是否使用它们以及函数的功能,所以在决定是否使用它们以及使用的时候都只依赖于这函数的接口,整个使用的时候都只依赖于这函数的接口,整个过程中无需知晓它们内部的具体实现。过程中无需知晓它们内部的具体实现。52抽象抽象l用户:抽象是用户的用户:抽象是用户的“权利权利”。l设计者:必须关注内部实现。设计者:必须关注内部实现。l被抽象的对象本身:必须具备
55、说明部分被抽象的对象本身:必须具备说明部分用以向用户说明自身,以及具备具体的用以向用户说明自身,以及具备具体的实现部分。实现部分。53抽象数据类型(抽象数据类型(Abstract Data Type, ADT) l在程序设计中,对于被抽象的数据,称为在程序设计中,对于被抽象的数据,称为抽象抽象数据类型数据类型(Abstract Data Type, ADT)。)。l一种一种ADT应具有应具有(1)说明部分)说明部分(说明该(说明该ADT是什么):说明部分是什么):说明部分描述数据值的特性和作用于这些数据之上的操描述数据值的特性和作用于这些数据之上的操作。作。ADT的用户仅须明白这些说明,而无须
56、知的用户仅须明白这些说明,而无须知晓其内部实现。晓其内部实现。 (2)实现部分)实现部分。54抽象数据类型抽象数据类型l时间类型时间类型类型类型 时间时间数据数据 每个日期的值都是时、分每个日期的值都是时、分操作操作 设置时间设置时间 获取时间获取时间 设置时间段设置时间段 比较两时间比较两时间为了实现一个为了实现一个ADT,应该:,应该:1)为这种)为这种ADT选择具体的选择具体的 数据表达数据表达;2)实现每种)实现每种操作操作。int hour minute;set()gethour()Getminute()setRange()isLaterThan()55数据封装与隐藏数据封装与隐藏l
57、时、分这些内部数据被隐藏在模块中(这里时、分这些内部数据被隐藏在模块中(这里的模块是文件的模块是文件TIME.cpp),客户程序只能通),客户程序只能通过该模块提供的公开操作来访问这些数据,过该模块提供的公开操作来访问这些数据,而不能直接访问这些数据。而不能直接访问这些数据。l这种保护措施称为这种保护措施称为信息隐藏信息隐藏(Information Hiding)l把这这些数据与相关操作组织在一起的方式把这这些数据与相关操作组织在一起的方式称为称为封装封装(Encapsulation)。)。56数据封装与隐藏数据封装与隐藏l客户程序:只客户程序:只关心关心TIME能够提供那些公开的能够提供那些
58、公开的操作(即提供了哪些函数可调用),并操作(即提供了哪些函数可调用),并不关心不关心这些操作的具体实现。也就是说,用户只这些操作的具体实现。也就是说,用户只关心关心TIME能能“做什么做什么”,而,而不关心不关心它内部它内部“如何如何做做”。l封装就是实现封装就是实现ADT的策略,而信息隐藏则是的策略,而信息隐藏则是ADT的特点。的特点。l信息隐藏和封装是软件开发的必要技术,亦具信息隐藏和封装是软件开发的必要技术,亦具商业价值。商业价值。 57术语术语ADT类类对象对象抽象抽象抽象抽象具体具体具体具体实例实例58类与对象概述类与对象概述l类:描述实体的抽象概念。类:描述实体的抽象概念。描述一
59、群实体描述一群实体的共同结构的共同结构l对象:对应于单个的具体实体。在程序中对象:对应于单个的具体实体。在程序中模拟实体。模拟实体。59类与对象概述类与对象概述l类背后蕴涵的基本思想是类背后蕴涵的基本思想是数据抽象数据抽象和和封装封装l数据抽象是一种依赖于接口和实现分离的设计和数据抽象是一种依赖于接口和实现分离的设计和编程技术编程技术l类设计者必须关心类是如何实现的类设计者必须关心类是如何实现的l类的使用者不必了解类的实现细节。相反,使用某个类的使用者不必了解类的实现细节。相反,使用某个类的程序员仅需了解类的接口,他们可以抽象地考虑类的程序员仅需了解类的接口,他们可以抽象地考虑该类做什么,而不
60、必具体地考虑该类如何工作该类做什么,而不必具体地考虑该类如何工作60类与对象概述类与对象概述l封装是一种将低级元素结合起来形成新的、高级封装是一种将低级元素结合起来形成新的、高级实体的技术实体的技术l函数是封装的一种形式函数是封装的一种形式l函数所执行的细节行为被封装在函数本身这个更大函数所执行的细节行为被封装在函数本身这个更大的实体中的实体中l被封装的元素隐藏了它们的实现细节被封装的元素隐藏了它们的实现细节我们可以我们可以调用一个函数但不能访问它所执行的语句调用一个函数但不能访问它所执行的语句l类也是一个封装实体类也是一个封装实体:它代表若干成员的聚集,大多:它代表若干成员的聚集,大多数设计
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit 3 What would you like Part A Lets learn(教学设计)-2023-2024学年人教PEP版英语五年级上册
- 小学信息技术一年级上册第第7课 《播放动画与幻灯片》教学设计
- 《百变飞机 》(教学设计)浙教版二年级上册综合实践活动
- Unit2 An Accident(教学设计)-2024-2025学年北师大版(三起)英语六年级上册
- 幼儿园中班秋季保教工作计划(含进度表)
- ni仿真电容两端电压信号与实际电路不符
- mos功率管栅极扰动
- 电缆熔接的焊粉
- 提升创新能力的激励机制计划
- Unit 1 Let's be friends Lesson 4 Fuel up(教学设计)-2024-2025学年外研版(三起)(2024)三年级上册
- 电网工程设备材料信息参考价(2024年第四季度)
- 《你当像鸟飞往你的山》读书分享读书分享笔记
- 2024年浙江省中考社会试卷真题(含标准答案及评分标准)
- 20以内退位减法口算练习题100题30套(共3000题)
- 企业公司组织架构图word模板
- 气管支气管结核诊断和治疗指南
- 国际标准智商测试39题详细答案参考模板
- 高中临界生冲刺一本培养方案
- 球团实验方案
- 供应商社会准则符合性自审问卷
- LemonTree中英文歌词
评论
0/150
提交评论