第7章 继承与派生_第1页
第7章 继承与派生_第2页
第7章 继承与派生_第3页
第7章 继承与派生_第4页
第7章 继承与派生_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

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

文档简介

第七章类的继承,清华大学郑莉,目录,7.1类的继承与派生7.2访问控制7.3类型兼容规则7.4派生类的构造、析构函数7.5派生类成员的标识与访问7.6程序实例用高斯消去法解线性方程组7.7综合实例个人银行账户管理程序7.8深度探索7.9小结,2,7.1类的继承与派生,继承与派生是同一过程从不同的角度来看保持已有类的特性而构造新类的过程称为继承。在已有类的基础上新增自己的特性而产生新类的过程称为派生。被继承的已有类称为基类(或父类)。派生出的新类称为派生类。直接参与派生出某类的基类称为直接基类,基类的基类甚至更高层的基类称为间接基类。,3,7.1类的继承与派生,继承与派生的目的,继承的目的:实现代码重用。派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。,4,7.1类的继承与派生7.1.1派生与继承的实例,7.1.2派生类的声明,单继承时class派生类名:继承方式基类名成员声明;例如:classDerived:publicBase1,privateBase2public:Derived();Derived();,5,7.1类的继承与派生7.1.2派生类的定义,7.1.2派生类的声明,多继承时class派生类名:继承方式1基类名1,继承方式2基类名2,.成员声明;注意:每一个“继承方式”,只用于限制对紧随其后之基类的继承。,6,7.1类的继承与派生7.1.2派生类的定义,7.1.3派生类生成过程,吸收基类成员吸收基类成员之后,派生类实际上就包含了它的全部基类中除构造和析构函数之外的所有成员。改造基类成员如果派生类声明了一个和某基类成员同名的新成员(如果是成员函数,则参数表也要相同,参数不同的情况属于重载),派生的新成员就覆盖了外层同名成员添加新的成员派生类新成员的加入是继承与派生机制的核心,是保证派生类在功能上有所发展,7,7.1类的继承与派生,7.2访问控制,不同继承方式的影响主要体现在:派生类成员对基类成员的访问权限通过派生类对象对基类成员的访问权限三种继承方式公有继承私有继承保护继承,8,7.2访问控制,7.2.1公有继承(public),基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象只能访问基类的public成员。,9,7.2访问控制7.2.1公有继承,10,例7-1公有继承举例,/Point.h#ifndef_POINT_H#define_POINT_HclassPoint/基类Point类的定义public:/公有函数成员voidinitPoint(floatx=0,floaty=0)this-x=x;this-y=y;voidmove(floatoffX,floatoffY)x+=offX;y+=offY;floatgetX()constreturnx;floatgetY()constreturny;private:/私有数据成员floatx,y;#endif/_POINT_H,7.2访问控制7.2.1公有继承,11,例7-1(续),/Rectangle.h#ifndef_RECTANGLE_H#define_RECTANGLE_H#includePoint.hclassRectangle:publicPoint/派生类定义部分public:/新增公有函数成员voidinitRectangle(floatx,floaty,floatw,floath)initPoint(x,y);/调用基类公有成员函数this-w=w;this-h=h;floatgetH()constreturnh;floatgetW()constreturnw;private:/新增私有数据成员floatw,h;#endif/_RECTANGLE_H,7.2访问控制7.2.1公有继承,12,例7-1(续),#include#includeusingnamespacestd;intmain()Rectanglerect;/定义Rectangle类的对象/设置矩形的数据rect.initRectangle(2,3,20,10);rect.move(3,2);/移动矩形位置coutThedataofrect(x,y,w,h):endl;/输出矩形的特征参数coutrect.getX(),rect.getY(),rect.getW(),rect.getH()y=y;voidmove(floatoffX,floatoffY)x+=offX;y+=offY;floatgetX()constreturnx;floatgetY()constreturny;private:/私有数据成员floatx,y;#endif/_POINT_H,7.2访问控制7.2.2私有继承,15,例7-2(续),/Rectangle.h#ifndef_RECTANGLE_H#define_RECTANGLE_H#includePoint.hclassRectangle:privatePoint/派生类定义部分public:/新增公有函数成员voidinitRectangle(floatx,floaty,floatw,floath)initPoint(x,y);/调用基类公有成员函数this-w=w;this-h=h;voidmove(floatoffX,floatoffY)Point:move(offX,offY);floatgetX()constreturnPoint:getX();floatgetY()constreturnPoint:getY();floatgetH()constreturnh;floatgetW()constreturnw;private:/新增私有数据成员floatw,h;#endif/_RECTANGLE_H,7.2访问控制7.2.2私有继承,16,例7-2(续),#include#includeusingnamespacestd;intmain()Rectanglerect;/定义Rectangle类的对象rect.initRectangle(2,3,20,10);/设置矩形的数据rect.move(3,2);/移动矩形位置coutThedataofrect(x,y,w,h):endl;coutrect.getX(),/输出矩形的特征参数rect.getY(),rect.getW(),rect.getH()endl;return0;,7.2访问控制7.2.2私有继承,7.2.3保护继承(protected),基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象不能直接访问基类中的任何成员,17,7.2访问控制7.2.3保护继承,protected成员的特点与作用,对建立其所在类对象的模块来说,它与private成员的性质相同。对于其派生类来说,它与public成员的性质相同。既实现了数据隐藏,又方便继承,实现代码重用。,18,7.2访问控制7.2.3保护继承,19,例:protected成员举例,classAprotected:intx;intmain()Aa;a.x=5;/错误,7.2访问控制7.2.3保护继承,20,例(续),classAprotected:intx;classB:publicApublic:voidfunction();voidB:function()x=5;/正确,7.2访问控制7.2.3保护继承,多继承举例,classApublic:voidsetA(int);voidshowA()const;private:inta;classBpublic:voidsetB(int);voidshowB()const;,private:intb;classC:publicA,privateBpublic:voidsetC(int,int,int);voidshowC()const;privateconst:intc;,21,7.2访问控制,多继承举例(续),voidA:setA(intx)a=x;voidB:setB(intx)b=x;voidC:setC(intx,inty,intz)/派生类成员直接访问基类的/公有成员setA(x);setB(y);c=z;/其他函数实现略,intmain()Cobj;obj.setA(5);obj.showA();obj.setC(6,7,9);obj.showC();/obj.setB(6);错误/obj.showB();错误return0;,22,7.2访问控制,7.3类型转换规则,一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:派生类的对象可以隐含转换为基类对象。派生类的对象可以初始化基类的引用。派生类的指针可以隐含转换为基类的指针。通过基类对象名、指针只能使用从基类继承的成员,23,7.3类型转换规则,24,例7-3类型转换规则举例,#includeusingnamespacestd;classBase1/基类Base1定义public:voiddisplay()constcoutBase1:display()endl;classBase2:publicBase1/公有派生类Base2定义public:voiddisplay()constcoutBase2:display()endl;classDerived:publicBase2/公有派生类Derived定义public:voiddisplay()constcoutDerived:display()成员名intmain()/主函数Base1base1;/声明Base1类对象Base2base2;/声明Base2类对象Derivedderived;/声明Derived类对象fun(,7.3类型转换规则,运行结果:Base1:display()Base1:display()Base1:display(),绝对不要重新定义继承而来的非虚函数,继承时的构造函数,基类的构造函数不被继承,派生类中需要声明自己的构造函数。定义构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,自动调用基类构造函数完成。派生类的构造函数需要给基类的构造函数传递参数,26,7.4派生类的构造和析构函数7.4.1构造函数,单一继承时的构造函数,派生类名:派生类名(基类所需的形参,本类成员所需的形参):基类名(参数表),本类成员初始化列表/其他初始化;,27,7.4派生类的构造和析构函数7.4.1构造函数,28,单一继承时的构造函数举例,#includeusingnamecpacestd;classBpublic:B();B(inti);B();voidprint()const;private:intb;,7.4派生类的构造和析构函数7.4.1构造函数,29,单一继承时的构造函数举例(续),B:B()b=0;coutBsdefaultconstructorcalled.endl;B:B(inti)b=i;coutBsconstructorcalled.endl;B:B()coutBsdestructorcalled.endl;voidB:print()constcoutbendl;,7.4派生类的构造和析构函数7.4.1构造函数,30,单一继承时的构造函数举例(续),classC:publicBpublic:C();C(inti,intj);C();voidprint()const;private:intc;C:C()c=0;coutCsdefaultconstructorcalled.endl;C:C(inti,intj):B(i),c(j)coutCsconstructorcalled.endl;,7.4派生类的构造和析构函数7.4.1构造函数,31,单一继承时的构造函数举例(续),C:C()coutCsdestructorcalled.endl;voidC:print()constB:print();coutcendl;intmain()Cobj(5,6);obj.print();return0;,7.4派生类的构造和析构函数7.4.1构造函数,多继承时的构造函数,派生类名:派生类名(参数表):基类名1(基类1初始化参数表),基类名2(基类2初始化参数表),.基类名n(基类n初始化参数表),本类成员初始化列表/其他初始化;,32,7.4派生类的构造和析构函数7.4.1构造函数,派生类与基类的构造函数,当基类中声明有缺省构造函数或未声明构造函数时,派生类构造函数可以不向基类构造函数传递参数,也可以不声明,构造派生类的对象时,基类的缺省构造函数将被调用。当需要执行基类中带形参的构造函数来初始化基类数据时,派生类构造函数应在初始化列表中为基类构造函数提供参数。,33,7.4派生类的构造和析构函数7.4.1构造函数,多继承且有内嵌对象时的构造函数,派生类名:派生类名(形参表):基类名1(参数),基类名2(参数),.基类名n(参数),本类对象成员和基本类型成员初始化列表/其他初始化;,34,7.4派生类的构造和析构函数7.4.1构造函数,构造函数的执行顺序,调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。对本类成员初始化列表中的基本类型成员和对象成员进行初始化,初始化顺序按照它们在类中声明的顺序。对象成员初始化是自动调用对象所属类的构造函数完成的。执行派生类的构造函数体中的内容。,35,7.4派生类的构造和析构函数7.4.1构造函数,36,例7-4派生类构造函数举例,#includeusingnamespacestd;classBase1/基类Base1,构造函数有参数public:Base1(inti)coutConstructingBase1iendl;classBase2/基类Base2,构造函数有参数public:Base2(intj)coutConstructingBase2jendl;classBase3/基类Base3,构造函数无参数public:Base3()coutConstructingBase3*endl;,7.4派生类的构造和析构函数7.4.1构造函数,37,例7-4(续),classDerived:publicBase2,publicBase1,publicBase3/派生新类Derived,注意基类名的顺序public:/派生类的公有成员Derived(inta,intb,intc,intd):Base1(a),member2(d),member1(c),Base2(b)/注意基类名的个数与顺序,/注意成员对象名的个数与顺序private:/派生类的私有成员对象Base1member1;Base2member2;Base3member3;intmain()Derivedobj(1,2,3,4);return0;,7.4派生类的构造和析构函数7.4.1构造函数,运行结果:constructingBase22constructingBase11constructingBase3*constructingBase13constructingBase24constructingBase3*,7.4.2复制构造函数,若建立派生类对象时没有编写复制构造函数,编译器会生成一个隐含的复制构造函数,该函数先调用基类的复制构造函数,再为派生类新增的成员对象执行拷贝。若编写派生类的复制构造函数,则需要为基类相应的复制构造函数传递参数。例如:C:C(constCclassBase1/基类Base1,构造函数有参数public:Base1(inti)coutConstructingBase1iendl;Base1()coutDestructingBase1endl;classBase2/基类Base2,构造函数有参数public:Base2(intj)coutConstructingBase2jendl;Base2()coutDestructingBase2endl;classBase3/基类Base3,构造函数无参数public:Base3()coutConstructingBase3*endl;Base3()coutDestructingBase3endl;,7.4派生类的构造和析构函数7.4.3析构函数,41,例7-5(续),classDerived:publicBase2,publicBase1,publicBase3/派生新类Derived,注意基类名的顺序public:/派生类的公有成员Derived(inta,intb,intc,intd):Base1(a),member2(d),member1(c),Base2(b)/注意基类名的个数与顺序,注意成员对象名的个数与顺序private:/派生类的私有成员对象Base1member1;Base2member2;Base3member3;intmain()Derivedobj(1,2,3,4);return0;,7.4派生类的构造和析构函数7.4.3析构函数,42,例7-5(续),运行结果:ConstructingBase22ConstructingBase11ConstructingBase3*ConstructingBase13ConstructingBase24ConstructingBase3*DestructingBase3DestructingBase2DestructingBase1DestructingBase3DestructingBase1DestructingBase2,7.4派生类的构造和析构函数7.4.3析构函数,7.5.1作用域限定,当派生类与基类中有相同成员时:若未特别限定,则通过派生类对象使用的是派生类中的同名成员。如要通过派生类对象访问基类中被隐藏的同名成员,应使用基类名和作用域操作符(:)来限定。,43,7.5派生类成员的标识与访问,44,例7-6多继承同名隐藏举例,#includeusingnamespacestd;classBase1/定义基类Base1public:intvar;voidfun()coutMemberofBase1endl;classBase2/定义基类Base2public:intvar;voidfun()coutMemberofBase2endl;classDerived:publicBase1,publicBase2/定义派生类Derivedpublic:intvar;/同名数据成员voidfun()coutMemberofDerivedendl;/同名函数成员;,7.5派生类成员的标识与访问7.5.1作用域限定,45,例7-6(续),intmain()Derivedd;Derived*p=,7.5派生类成员的标识与访问7.5.1作用域限定,二义性问题,当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性采用虚基类来解决。在多继承时,基类与派生类之间,或基类之间出现同名成员时,将出现访问时的二义性(不确定性)采用虚函数(参见第8章)或同名隐藏来解决。,46,7.5派生类成员的标识与访问7.5.1作用域限定,二义性问题举例,classApublic:voidf();classBpublic:voidf();voidg();,classC:publicA,piblicBpublic:voidg();voidh();如果定义:Cc1;则c1.f()具有二义性而c1.g()无二义性(同名隐藏),47,7.5派生类成员的标识与访问7.5.1作用域限定,解决方法一:用类名来限定c1.A:f()或c1.B:f()解决方法二:同名隐藏在C中声明一个同名成员函数f(),f()再根据需要调用A:f()或B:f(),例7-7多继承同名隐藏举例,/7_7.cpp#includeusingnamespacestd;classBase0/定义基类Base0public:intvar0;voidfun0()coutMemberofBase0endl;classBase1:publicBase0/定义派生类Base1public:/新增外部接口intvar1;classBase2:publicBase0/定义派生类Base2public:/新增外部接口intvar2;,48,7.5派生类成员的标识与访问7.5.1作用域限定,例7-7(续),classDerived:publicBase1,publicBase2/定义派生类Derivedpublic:/新增外部接口intvar;voidfun()coutMemberofDerivedendl;intmain()/程序主函数Derivedd;/定义Derived类对象dd.Base1:var0=2;/使用直接基类d.Base1:fun0();d.Base2:var0=3;/使用直接基类d.Base2:fun0();return0;,49,7.5派生类成员的标识与访问7.5.1作用域限定,派生类C的对象的存储结构示意图:,有二义性:Derivedd;d.var0d.Base0:var0,无二义性:d.Base1:var0d.Base2:var0,50,7.5派生类成员的标识与访问7.5.1作用域限定,问题:冗余以及因冗余而导致的不一致性,7.5.2虚基类,虚基类的引入用于有共同基类的场合声明以virtual修饰说明基类例:classB1:virtualpublicB作用主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题.为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝注意:在第一级继承时就要将共同基类设计为虚基类。,51,7.5派生类成员的标识与访问,52,例7-8虚基类举例,7.5派生类成员的标识与访问7.5.2虚基类,53,例7-8(续),#includeusingnamespacestd;classBase0/定义基类Base0public:intvar0;voidfun0()coutMemberofBase0endl;classBase1:virtualpublicBase0/定义派生类Base1public:/新增外部接口intvar1;classBase2:virtualpublicBase0/定义派生类Base2public:/新增外部接口intvar2;,7.5派生类成员的标识与访问7.5.2虚基类,54,例7-8(续),classDerived:publicBase1,publicBase2/定义派生类Derivedpublic:/新增外部接口intvar;voidfun()coutMemberofDerivedendl;intmain()/程序主函数Derivedd;/定义Derived类对象dd.var0=2;/直接访问虚基类的数据成员d.fun0();/直接访问虚基类的函数成员return0;,7.5派生类成员的标识与访问7.5.2虚基类,7.5.3虚基类及其派生类构造函数,建立对象时所指定的类称为最(远)派生类。虚基类的成员是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。如果未列出,则表示调用该虚基类的默认构造函数。在建立对象时,只有最派生类的构造函数调用虚基类的构造函数,该派生类的其他基类对虚基类构造函数的调用被忽略。,55,7.5派生类成员的标识与访问,56,有虚基类时的构造函数举例,#includeusingnamespacestd;classBase0/定义基类Base0public:Base0(intvar):var0(var)intvar0;voidfun0()coutMemberofBase0endl;classBase1:virtualpublicBase0/定义派生类Base1public:/新增外部接口Base1(intvar):Base0(var)intvar1;classBase2:virtualpublicBase0/定义派生类Base2public:/新增外部接口Base2(intvar):Base0(var)intvar2;,7.5派生类成员的标识与访问7.5.3虚基类及其派生类构造函数,57,有虚基类时的构造函数举例(续),classDerived:publicBase1,publicBase2/定义派生类Derivedpublic:/新增外部接口Derived(intvar):Base0(var),Base1(var),Base2(var)intvar;voidfun()coutMemberofDerivedendl;intmain()/程序主函数Derivedd(1);/定义Derived类对象dd.var0=2;/直接访问虚基类的数据成员d.fun0();/直接访问虚基类的函数成员return0;,7.5派生类成员的标识与访问7.5.3虚基类及其派生类构造函数,7.6程序实例,用高斯消去法解线性方程组,58,7.6程序实例用高斯消去法解线性方程组,算法原理求解Ax=b经过推算得到计算公式:,59,7.6.1算法基本原理,7.6.2程序设计分析,60,7.6程序实例用高斯消去法解线性方程组,7.6.3源程序及说明,例7-9全选主元高斯消去法解线性方程组整个程序分为三个独立的文档,LinearEqu.h文件中包括矩阵类Matrix和线性方程组类LinearEqu的定义,LinearEqu.cpp文件中包括这两个类的成员函数实现文件;lequmain.cpp文件包括程序的主函数,主函数中定义了一个类LinearEqu的对象,通过这个对象求解一个四元线性方程组。,61,7.6程序实例用高斯消去法解线性方程组7.6.3源程序及说明,/Matrix.h文件一,Matrix类定义#ifndef_MATRIX_H#define_MATRIX_HclassMatrix/基类Matrix定义public:/外部接口Matrix(intsize=2);/构造函数Matrix();/析构函数voidsetMatrix(constdouble*values);/矩阵赋初值voidprintMatrix()const;/显示矩阵intgetSize()constreturnsize;/得到矩阵大小double#endif/_MATRIX_H,62,例7-9(续),7.6程序实例用高斯消去法解线性方程组7.6.3源程序及说明,/LinearEqu.h文件二,LinearEqu类定义#ifndef_LINEAR_EQU_H#define_LINEAR_EQU_H#includeMatrix.hclassLinearEqu:publicMatrix/公有派生类LinearEqu定义public:/外部接口LinearEqu(intsize=2);/构造函数LinearEqu();/析构函数/方程赋值voidsetLinearEqu(constdouble*a,constdouble*b);boolsolve();/全选主元高斯消去法求解方程voidprintLinearEqu()const;/显示方程voidprintSolution()const;/显示方程的解private:/私有数据double*sums;/方程右端项double*solution;/方程的解;#endif/_LINEAREQU_H,63,例7-9(续),7.6程序实例用高斯消去法解线性方程组7.6.3源程序及说明,/Matrix.cpp文件三,Matrix类实现#includeMatrix.h/包含类的定义头文件#includeusingnamespacestd;voidMatrix:setMatrix(constdouble*values)/设置矩阵for(inti=0;isize*size;i+)elementsi=valuesi;/矩阵成员赋初值/矩阵Matrix类的构造函数Matrix:Matrix(intsize/*=2*/):size(size)elements=newdoublesize*size;/动态内存分配Matrix:Matrix()/矩阵Matrix类的析构函数deleteelements;/内存释放voidMatrix:printMatrix()const/显示矩阵的元素coutTheMatrixis:endl;for(inti=0;isize;i+)for(intj=0;jsize;j+)coutelement(i,j);coutendl;,64,例7-9(续),7.6程序实例用高斯消去法解线性方程组7.6.3源程序及说明,/LinearEqu.cpp文件四,LinearEqu类实现#includeLinearEqu.h/包含类的定义头文件#include#includeusingnamespacestd;LinearEqu:LinearEqu(intsize/*=2*/):Matrix(size)/用size调用基类构造函数sums=newdoublesize;/动态内存分配solution=newdoublesize;LinearEqu:LinearEqu()/派生类LinearEqu的析构函数deletesums;/释放内存deletesolution;/会自动调用基类析构函数voidLinearEqu:setLinearEqu(constdouble*a,constdouble*b)/设置线性方程组setMatrix(a);/调用基类函数for(inti=0;igetSize();i+)sumsi=bi;,65,例7-9(续),7.6程序实例用高斯消去法解线性方程组7.6.3源程序及说明,voidLinearEqu:printLinearEqu()const/显示线性方程组coutTheLineequtionis:endl;for(inti=0;igetSize();i+)for(intj=0;jgetSize();j+)coutelement(i,j);coutsumsiendl;voidLinearEqu:printSolution()const/输出方程的解coutTheResultis:endl;for(inti=0;igetSize();i+)coutxi=solutioniendl;inlinevoidswap(double,66,例7-9(续),7.6程序实例用高斯消去法解线性方程组7.6.3源程序及说明,boolLinearEqu:solve()/全选主元素高斯消去法求解方程int*js=newintgetSize();/存储主元素所在列号的数组for(intk=0;kmax)max=t;jsk=j;is=i;if(max=0)deletejs;returnfalse;,67,例7-9(续),7.6程序实例用高斯消去法解线性方程组7.6.3源程序及说明,else/通过行、列交换,把主元素交换到第k行第k列if(jsk!=k)for(inti=0;igetSize();i+)swap(element(i,k),element(i,jsk);if(is!=k)for(intj=k;jgetSize();j+)swap(element(k,j),element(is,j);swap(sumsk,sumsis);/消去过程doublemajor=element(k,k);for(intj=k+1;jgetSize();j+)element(k,j)/=major;sumsk/=major;for(inti=k+1;igetSize();i+)for(intj=k+1;jgetSize();j+)element(i,j)-=element(i,k)*element(k,j);sumsi-=element(i,k)*sumsk;,68,例7-9(续),7.6程序实例用高斯消去法解线性方程组7.6.3源程序及说明,/判断剩下的一个元素是否等于0doubled=element(getSize()-1,getSize()-1);if(fabs(d)=0;i-)doublet=0.0;for(intj=i+1;j=0;k-)if(jsk!=k)swap(solutionk,solutionjsk);deletejs;returntrue;,69,例7-9(续),7.6程序实例用高斯消去法解线性方程组7.6.3源程序及说明,/7_9.cpp文件五,主函数#includeLinearEqu.h/类定义头文件#includeusingnamespacestd;intmain()/主函数doublea=/方程系数矩阵0.2368,0.2471,0.2568,1.2671,/第一行0.1968,0.2071,1.2168,0.2271,/第二行0.1581,1.1675,0.1768,0.1871,/第三行1.1161,0.1254,0.1397,0.1490;/第四行doubleb=1.8471,1.7471,1.6471,1.5471;/方程右端项LinearEquequ(4);/定义一个四元方程组对象equ.setLinearEqu(a,b);/设置方程组equ.printLinearEqu();/输出方程组if(equ.solve()/求解方程组equ.printSolution();/输出方程组的解elsecoutFailendl;return0;,70,例7-9(续),7.6程序实例用高斯消去法解线性方程组7.6.3源程序及说明,例7-9(续),运行结果为:TheLineequtionis:/方程组0.23680.24710.25681.26711.84710.19680.20711.21680.22711.74710.15811.16750.17680.18711.64711.11610.12540.13970.1491.5471TheResultis:/方程组的解X0=1.04058X1=0.987051X2=0.93504X3=0.881282,71,7.6程序实例用高斯消去法解线性方程组7.6.3源程序及说明,7.7.1问题的提出,使用继承和派生往个人银行账户管理程序中增加信用账号平时没有利息,透支时需要支付透支利息,且每个月结算一次,72,7.7综合实例个人银行账户管理程序,73,7.7综合实例个人银行账户管理程序7.7.2类设计,7.7.3源程序及说明,例7-10个人银行账户管理程序整个程序分为6个文件:date.h是日期类头文件,date.cpp是日期类实现文件,accumulator.h为按日将数值累加的Accumulator类的头文件,account.h是各个储蓄账户类定义头文件,account.cpp是各个储蓄账户类实现文件,7_10.cpp是主函数文件。重复的文件或内容不再给出,74,7.7综合实例个人银行账户管理程序7.7.3源程序及说明,/accumulator.h#ifndef_ACCUMULATOR_H_#define_ACCUMULATOR_H_#includedate.hclassAccumulator/将某个数值按日累加private:DatelastDate;/上次变更数值的时期doublevalue;/数值的当前值doublesum;/数值按日累加之和public:/构造函数,date为开始累加的日期,value为初始值Accumulator(constDate,75,7.7综合实例个人银行账户管理程序7.7.3源程序及说明,例7-10(续),/accumulator.h#ifndef_ACCUMULATOR_H_#define_ACCUMULATOR_H_#includedate.hclassAccumulator/将某个数值按日累加private:DatelastDate;/上次变更数值的时期doublevalue;/数值的当前值doublesum;/数值按日累加之和public:/构造函数,date为开始累加的日期,value为初始值Accumulator(constDate,76,7.7综合实例个人银行账户管理程序7.7.3源程序及说明,例7-10(续),/初始化,将日期变为date,数值变为value,累加器清零voidreset(constDate,77,7.7综合实例个人银行账户管理程序7.7.3源程序及说明,例7-10(续),/记录一笔帐,date为日期,amount为金额,desc为说明voidrecord(constDate,78,7.7综合实例个人银行账户管理程序7.7.3源程序及说明,例7-10(续),voiddeposit(constDate,79,7.7综合实例个人银行账户管理程序7.7.3源程序及说明,例7-10(续),doublegetCredit()constreturncredit;doublegetRate()constreturnrate;doublegetFee()constreturnfee;doublegetAvailableCredit()const/获得可用信用if(getBalance()0)returncredit+getBalance();elsereturncredit;/存入现金voiddeposit(constDate#endif/_ACCOUNT_H_,80,7.7综合实例个人银行账户管理程序7.7.3源程序及说明,例7-10(续),/account.cpp#includeaccount.h#include#includeusingnamespacestd;doubleAccount:total=0;/Account类的实现Account:Account(constDate,81,7.7综合实例个人银行账户管理程序7.7.3源程序及说明,例7-10(续),/SavingsAccount类相关成员函数的实现SavingsAccount:SavingsAccount(constDate,82,7.7综合实例个人银行账户管理程序7.7.3源程序及说明,例7-10(续),/CreditAccount类相关成员函数的实现CreditAccount:CreditAccount(constDate,83,7.7综合实例个人银行账户管理程序7.7.3源程序及说明,例7-10(续),voidCreditAccount:settle(constDate,84,7.7综合实例个人银行账户管理程序7.7.3源程序及说明,例7-10(续),intmain()Datedate(2008,11,1);/起始日期/建立几个账户SavingsAccountsa1(date,S3755217,0.015);SavingsAccountsa2(date,02342342,0.015);CreditAccountca(date,C5392394,10000,0.0005,50);/11月份的几笔账目sa1.deposit(Date(2008,11,5),5000,salary);ca.withdraw(Date(2008,11,15),2000,buyacell);sa2.deposit(Date(2008,11,25),10000,sellstock0323);ca.settle(Date(2008,12,1);/结算信用卡/12月份的几笔账目ca.deposit(Date(2008,12,1),2016,repaythecredit);sa1.deposit(Date(2008,12,5),5500,salary);,85,7.7综合实例个人银行账户管理程序7.7.3源程序及说明,例7-10(续),/结算所有账户sa1.set

温馨提示

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

最新文档

评论

0/150

提交评论