CPP实训8qR.doc_第1页
CPP实训8qR.doc_第2页
CPP实训8qR.doc_第3页
CPP实训8qR.doc_第4页
CPP实训8qR.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章 静态成员和友元实训静态成员和友元的提出方便了程序的编写,可以满足一些特殊的要求,例如允许函数直接读写其他对象的私有数据成员。本章的学习目的是通过做习题和上机实验,学会怎样定义和使用静态成员和友元。8.1 典型习题解答【例8.1】 简述静态数据成员和普通数据成员的区别?【解答】类的普通数据成员相当于一个局部变量,只可以被该类的对象访问,而类的静态数据成员相当于一个全局变量,可以被任何实体访问;类中声明静态数据成员时并不能自动初始化这个变量,必须在类定义之外来初始化静态数据成员,而类声明普通数据成员时,可以由构造函数初始化这个变量。【例8.2】 写出静态成员的定义格式。【解答】将一个类的数据成员定义为静态的格式为:static 将一个类的成员函数定义为静态的格式为:static ()【例8.3】 定义一个工资类GZ,类包含一个保护数据成员money表示工资,一个静态数据成员sds表示个人所得税占工资的比率,一个静态成员函数modSDS更改sds。【解答】class GZ public: static void modSDS(float newSDS);static float sds;GZ(float m);virtual GZ();protected: float money;【例8.4】生成一个GZ类表示工资。用静态数据成员包含每个职工的sds(个人所得税占工资的比率)。类的每个成员包含一个私有数据成员money,表示当月工资。提供一个calSDS成员函数,计算个人应交所得税,并从money中扣除。提供一个static成员函数modSDS,将sds设置为新值。实例化两个不同的GZ对象people1和people2,工资分别为1200.0和1500.0。将sds设置为1,计算两人实际应发的工资数并打印新的结果。然后将sds设置为2,再次计算两人实际应发的工资数并打印新的结果。【解答】首先定义GZ类,class GZ public: static void modSDS(float newSDS); void calSDS();static float sds;GZ(float m);protected: float money;其次,要定义类GZ的成员函数,在这里注意要将静态数据成员的定义放在类定义之外。 GZ:GZ(float m) money = m;void GZ:calSDS() /计算并显示扣除个人所得税后的实际工资float mySDS = money * sds;coutmoney - mySDSendl;void GZ:modSDS(float newSDS) /将静态数据成员sds更改为新值sds = newSDS;/初始化静态变量float GZ:sds = 0;按照给定的数据实例化两个对象,计算并显示其实际工资:void main() GZ people1(1200), people2(1500); /实例化两个对象GZ:modSDS(0.01); /将个人所得税占工资的比率设为1cout个人所得税占工资的比率设为1时:endl;coutpeople1 的工资为:¥;people1.calSDS();coutpeople2 的工资为:¥;people2.calSDS();GZ:modSDS(0.02); /将个人所得税占工资的比率设为2cout个人所得税占工资的比率设为2时:endl;coutpeople1 的工资为:¥;people1.calSDS();coutpeople2 的工资为:¥;people2.calSDS();程序执行结果如下:个人所得税占工资的比率设为1时:people1 的工资为:¥1188people2 的工资为:¥1485个人所得税占工资的比率设为2时:people1 的工资为:¥1176people2 的工资为:¥1470【例8.5】简述类的友元函数与成员函数的区别,并写出友元函数的声明格式。【解答】一个类的友元函数是定义在类外部的一个函数,它不是类的成员函数,但是却可以象类的成员函数一样访问类的私有成员变量,在类的内部要有它的声明,声明的格式为:friend ()【例8.6】生成一个JX类表示矩形,矩形的长和宽作为其两个数据成员。编写一个求矩形面积的函数area(),并将它声明为JX的一个友元函数。实例化一个对象jx1, 长和宽分别为3和4。利用area()求出该矩形的面积。【解答】首先定义JX类,并将area()定义为其友元函数,class JX double a,b;public:JX(double x, double y)a = x;b = y;friend double area(JX &jx);定义函数area(),double area(JX &jx)return jx.a * jx.b;按照要求实例化一个对象,计算其友元函数area()计算矩形的面积,void main( )/实例化JX类的一个对象JX jx1(3, 4);cout长为3,宽为4的矩形,其面积为:area(jx1)endl;程序的执行结果如下:长为3,宽为4的矩形,其面积为:12【例8.7】什么是友元类?友元类的声明格式是什么?【解答】 如果一个类 A 是类 B 的友元类,那么类 A 的所有成员函数都是类 B 的友元函数。类A要在类B中声明,声明的格式为:friend class 【例8.8】生成一个名为TO的类,编写一个求两数之积的函数ji(),一个求两数平均值的函数junzhi()。将TO类声明为矩形类JX的友元类。实例化JX类的一个对象jx2,其长和宽为4、6。利用TO类的成员函数求出这个矩形的面积,长和宽的平均值。【解答】定义TO类和JX类,并将TO类声明为JX类的友元类,class JX double a,b;public:JX(double x, double y)a = x;b = y;friend class TO; /将类TO 声明为其友元类;class TO public:double junzhi(JX &jx);double ji(JX &jx);定义类TO的成员函数。double TO:ji(JX &jx)return jx.a * jx.b ;double TO:junzhi(JX &jx)return (jx.a + jx.b)/2;按要求实例化JX类的一个对象,利用TO类的成员函数求出这个矩形的面积,长和宽的平均值。void main()JX jx(4,6);TO to=TO();cout长为4,宽为6的矩形的面积为:to.ji(jx)endl;cout该矩形长与宽的平均值为:to.junzhi(jx)endl;程序的执行结果如下:长为4,宽为6的矩形的面积为:24该矩形长与宽的平均值为:5【例8.9】 运算符重载有哪些规则?【解答】运算符重载有以下一些规则:被重载的运算符一定不能是下面这些运算符中的一个:“.” 类成员运算符“*” 指针运算符“:” 类作用域运算符“?:” 条件运算符(1) 运算符被重载后,不能改变优先级和结合性,也不能改变语法结构,即不能将单目运算符重载为双目运算符。(2) 被重载的运算符必须是系统预先已经定义好的运算符,即不能自己定义新的运算符。(3) 被重载的运算符虽然可以用来做任何事情,但是最好还是应使其新的功能与系统预先定义的功能相似,以便使人容易理解。【例8.10】生成一个表示复数的类FS。复数的实部a和虚部b作为其数据成员。提供成员函数disp()显示复数,重载“”,“”为FS类的成员函数,用来计算两个复数的和与差。【解答】定义复数类FS。class FS double xb,sb;public:FS operator - (FS &);FS operator + (FS &);void disp();FS(double, double);FS(FS &);定义成员函数,并重载运算符“”和“”。FS:FS(double a, double b)sb = a;xb = b;FS:FS(FS &f)sb = f.sb;xb = f.xb;void FS:disp()cout(= 0)cout+;coutxb*i);FS FS:operator +(FS &f) /重载运算符“”FS g = *this;g.sb += f.sb;g.xb += f.xb;return g;FS FS:operator -(FS &f) /重载运算符“”FS g = *this;g.sb -= f.sb;g.xb -= f.xb;return g;实例化两个对象,并利用所重载的运算符对其进行运算。void main()FS one(2,3), two(4,5);FS three = one + two;one.disp();cout + ;two.disp();cout = ;three.disp();coutendl;FS four = two - one;two.disp();cout - ;one.disp();cout = ;four.disp();coutendl;程序的执行结果如下:(2+3i) + (4+5i) = (6+8i)(4+5i) - (2+3i) = (2+2i)【例8.11】生成时间类Time,类的每个成员包含private 数据成员h、m、s,分别表示当前时刻的小时、分钟和秒,重载“+”、“-”为Time类的成员函数,分别表示将当前时刻推后和提前一个小时。时间的表示采用24小时制;生成日期类Date,类的每个成员包含private 数据成员ye、mo、da,分别表示年、月和日;定义disp()为类Time和类Date的友元函数,用来显示日期和时间。【解答】首先声明时间类Time,包含3个私有的数据成员h、m和s分别表示当前时刻的小时、分钟和秒,包含两个成员函数“+”和“-”;再声明日期类Date,包含3个私有的数据成员ye、mo和da分别表示当前日期的年、月和日。并定义disp()为它们的友元函数。class Date;/先声名Date的存在,在Time类中才能使用class Timeprotected:int s;int m;int h;public:Time(int x, int y, int z);Time operator +();Time operator -();friend void disp(Date& d, Time& t);/使用的Date和Time都已经声名;class Dateprotected:int da;int mo;int ye;public:Date(int x, int y, int z);friend void disp(Date& d, Time& t);声明类Time和Date的成员函数,对类Time重载运算符“+”和“-”,并声明类Time和类Date的友元函数disp()用来显示当前的日期和时间。Time Time:operator +() /重载运算符“+”Time tm = *this;tm.h += 1;tm.h %=24;return tm;Time Time:operator -() /重载运算符“”Time tm = *this;tm.h -= 1;if (tm.h = -1)tm.h = 23;return tm;Time:Time(int x, int y, int z)h = x;m = y;s = z;Date:Date(int x, int y, int z)ye = x;mo = y;da = z;void disp(Date& dt, Time& tm) /显示当前的日期coutdt.mo/dt.da/dt.ye;cout ; /显示当前的时间couttm.h:tm.m:tm.s;实例化类Time和类Date的各一个对象,调用disp()显示当前的日期和时间,void main()Date d1(2002,7,10);Time t1(9,12,35); coutendl现在的时间是 ;disp(d1,t1);Time t2 = +t1;coutendl 100000)SDS = (x-100000)*SDS9;x=100000;if (x 80000)SDS += (x-80000)*SDS8;x=80000;if (x 60000)SDS += (x-60000)*SDS7;x=60000;if (x 40000)SDS += (x-40000)*SDS6;x=40000;if (x 20000)SDS += (x-20000)*SDS5;x=20000;if (x 5000)SDS += (x-5000)*SDS4;x=5000;if (x 2000)SDS += (x-2000)*SDS3;x=2000;if (x 500)SDS += (x-500)*SDS2;x=500;SDS += x*SDS1;cout 此人的工资数为:moneyendl;cout 个人所得税为:SDSendl;money -= SDS; /从工资中扣除个人所得税cout 实际应发的工资为:money 100000)/多于100000元部分的税率是SDS9SDS = (x-100000)*SDS9;x=100000;if (x 80000) /小于100000元大于80000元部分的税率是SDS8SDS += (x-80000)*SDS8;x=80000;if (x 60000) /小于80000元大于60000元部分的税率是SDS7SDS += (x-60000)*SDS7;x=60000;if (x 40000) /小于60000元大于40000元部分的税率是SDS6SDS += (x-40000)*SDS6;x=40000;if (x 20000) /小于40000元大于20000元部分的税率是SDS5SDS += (x-20000)*SDS5;x=20000;if (x 5000) /小于20000元大于5000元部分的税率是SDS4SDS += (x-5000)*SDS4;x=5000;if (x 2000) /小于5000元大于2000元部分的税率是SDS3SDS += (x-2000)*SDS3;x=2000;if (x 500) /小于2000元大于500元部分的税率是SDS2SDS += (x-500)*SDS2;x=500;SDS += x*SDS1; /小于500元部分的税率是SDS1计算出的总纳税额是SDS。8.3运算符重载实训8.3.1 实训题目和要求生成一个表示复数的类FS。复数的实部sb和虚部xb作为其数据成员。提供成员函数disp()显示复数,重载“”,“”,“*”,“/”为FS类的成员函数,用来计算两个复数的和、差、积、商。利用重载的运算符计算下列各式:(8+3i)+ (7-4i);(9+3i) (4+2i);(4+6i) *(2+3i);(7+4i) / (2+1i)。实训要求: 重载运算符“”。 重载运算符“”。 重载运算符“*”。 重载运算符“/”。 实例化FS类的8个对象,并利用重载的运算符对其进行计算。8.3.2 实训参考步骤首先声明复数类FS。class FS protected:double xb;double sb;public:FS operator * (FS &);FS operator / (FS &);FS operator - (FS &);FS operator + (FS &);void disp();FS(double a=0, double b=0);FS(FS &);定义成员函数,并重载运算符“”、“”、“*”和“/”。FS:FS(double a, double b)sb = a;xb = b;FS:FS(FS &f)sb = f.sb;xb = f.xb;void FS:disp()cout(= 0)cout+;coutxb*i);FS FS:operator +(FS &f) /重载运算符“”FS g = *this;g.sb += f.sb;g.xb += f.xb;return g;FS FS:operator -(FS &f) /重载运算符“”FS g = *this;g.sb -= f.sb;g.xb -= f.xb;return g;FS FS:operator *(FS &f) /重载运算符“*”FS g = *this;FS h;h.sb = g.s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论