面向对象程序设计(C)实验资料_第1页
面向对象程序设计(C)实验资料_第2页
面向对象程序设计(C)实验资料_第3页
面向对象程序设计(C)实验资料_第4页
面向对象程序设计(C)实验资料_第5页
已阅读5页,还剩29页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、面向对象程序设计( C+ )实验 软件工程 08 实验一C+ 程序设计基础练习 1实验目的 (1) 学习编写简单的 C+程序并掌握 C+程序的基本格式与规范。 (2) 理解C+程序结构的特点。 (3) 学习C+程序基本的输入输出操作。 (4) 学习数据类型常量和变量以及修饰符的使用。 (5) 学习基本的函数定义与调用方法。 (6) 学习作用域运算符的功能与基本使用方法。 (7) 学习内存的动态分配与释放方法。 (8) 学习引用的概念,掌握引用的基本使用方法。 2 实验基本要求 (1) 输入并运行所给的参考程序1,并将程序中的注释部分也输入计算机,体会和理解程 序的基本格式规范。 (2) 编制一

2、个完整的包含输入和输出的简单C+程序,如参考程序 2和参考程序3。掌握 输入输出及其格式控制的基本使用方法。 (3) 输入并调试参考程序 4 和参考程序 5,体会和理解内置函数与函数重载的概念与基本 使用方法。 (4) 输入并调试参考程序 6 和参考程序 7。体会和理解作用域运算符的概念与基本使用方 法。 (5) 输入并调试参考程序8 和参考程序 9,体会和理解内存动态分配的概念与new、delete 运算符的基本使用方法。 3. 实验基本步骤 (1) 建立一个控制台应用程序项目baseforml,向其中添加一个源程序文件sum. cpp。按 照所给的程序代码输入到计算机中,检查和调试程序,在

3、确认没有发现错误之后,选择 【Build】t【Build sum.exe】编译源程序,再选择【Build】宀【Execute sum.exe】运行程序.并 观察输出结果。若有问题,则需要重新检查程序。 说明:在C+程序中如果使用了系统提供的一些功能(如cin和cout),就必须在程序的首 部首先声明相关的包含这些功能的头文件(如iostream.h),否则,系统无法找到实现这些功 能的代码。在C+语言中一个头文件就是一个类库,类与类的预定义对象就包含在其中。所 以,在使用这些类库中所包含的预定义对象时,必须在程序首部加以声明。 / 参考程序 1 /sum.cpp #include int ad

4、d(int a ,int b); int main() int x,y,sum; coutEnter two numbers:x; ciny; sum=add(x,y); coutThe sum is:sumn; return 0; int add(int a,int b) int c; c=a+b; return c; 运行结果: (2) 按照参考程序 l 的输入与调试方法,输入、检查、调试和运行参考程序 3,掌握输入输出及其格式控制的基本使用方法。 / 参考程序 2 #include int main() char name20; coutname; coutname; return 0;

5、 运行结果: / 参考程序 3 #include int main() int x=25; couthexx decx octx n; 运行结果: (3) 按照参考程序 1 的输入与调试方法,输入、检查、调试和运行参考程序 5。理解内置函数与函数重载的概念与基本使用方法。 2 和参考程序 4 和参考程序 / 参考程序 4 #include inline int doub(int x) return x*2; int main() for(int i=1;i3;i+) couti d”oubled is ”doub(i)endl; cout ”1+2 doubled is ”doub(1+2)e

6、ndl; 运行结果: / 参考程序 5 #include int mul(int x,int y) return x*y; int mul(int x,int y,int z) return x*y*z; void main() int a=3,b=4,c=5; couta * b = mul(a,b)endl; couta * b *c =mul(a,b,c)endl; 6 和参考程序 (4) 按照参考程序 1 的输入与调试方法,输入、检查、调试和运行参考程序 7,并观察输出结果,体会和理解作用域运算符的概念与基本使用方法。 / 参考程序 6 #include int avar=10; ma

7、in() int avar; avar=25; cout ”avar is ”avarendl; return 0; 运行结果: / 参考程序 7 #include int avar; main() int avar; avar=25;/局部变量 avar :avar=10;/全局变量 avar cout ”local avar= ”avarendl; cout ”global avar= ”:avarendl; return 0; 运行结果: (5) 按照参考程序 1 的输入与调试方法,输入、检查、调试和运行参考程序 8 和参考程 序 9,并观察输出结果,体会和理解内存动态分配的概念与new

8、、 delete 运算符的基本使用 方法。 / 参考程序 8 #include main() int *p;/声明一个整型指针变量 p p=new int;/ 动态分配一个 int 型存储区,并将首地址赋给 p *p=10; cout*p; delete p;/撤销指针,释放 p 指向的存储空间 return 0; 运行结果: / 参考程序 9 #include main() int *p; p=new int; if(!p) cout ”allocation failuren ”; return 1; *p=20; cout*p; delete p; return 0; 运行结果: 4. 实

9、验结论 : 实验二 类和对象 1实验目的: (1) 掌握 Visual C+6.0 基本操作 (2) 了解 C+ 程序运行环境; (3) 掌握简单的 C+ 程序的开发过程(编辑、编译、连接和运行)。 (4) 掌握类及其成员的定义方法; (5) 掌握对象的创建方法; 2实验内容: 2.1 按要求分析程序指出程序运行的结果: 1) 分析下面的程序,并给出程序运行的结果: #include class change char c1,c2; public: void set(char a)c2=(c1=a)-32); void print() coutc1 can be upwritten as c2

10、endl; ; void main() change a,b; a. set(a); b. set(b); a. print(); b. print(); 运行结果: 程序分析: 2) 分析下面的程序,并给出输出结果: #include class pair char c1,c2; public: void set(char b) c1=1+(c2=b); unsigned where_am_I() return(unsigned)this); void print() coutc1+c2t; ; void main() pair a,b,c; a. set(A); b. set(B); c.

11、 set(C); a. print(); coutis at a.where_am_I()n; b. print(); coutis at b.where_am_I()n; c. print(); coutis at c.where_am_I()n; 运行结果: 程序分析: 2.2 编写并调试程序: 1)下面是一个类的测试程序,给定主函数,请写出类的定义,构成一个完整的程序,使执行 程序后输出结果为: 88-32=56 给定的主函数为: void main() Tst t; t.init(88,32); t.print(); 2)编程分析 init() 和 由主函数可知,要创建的类名为Tst,

12、 个类对象为t,类中含有两个公有成员函数 print() ,利用函数 init() 对两个私有成员数据赋值,即为减数与被减数的数值,为了程序的实 现需要定义第三个成员数据作为减法之差。 3)源程序 #include class Tst ; void main() Tst t; t.init(88,32); t.print(); 4)运行结果 88-32=56 5)调试情况分析 3.实验结论 : 实验三 类的应用 1. 实验目的: 1) 掌握类及成员的定义方法; 2) 掌握对象的创建方法; 3) 掌握对象数组、对象指针及 *this 指针的使用。 2.实验内容 : 2.1 分析下面的程序,指出错

13、误的地方 原来的程序如下: Class CSample int a=2.5; Public: Int b; Void Print() couta+b n ; Void Set(int x,int y) A=x; Y=b; Void main() CSample Sam1,Sam2; Sam1.Set(2,3); Sam2.Set(5,6); Sam1.Print(); Sam2.Print(); Coutsam1.a+sam2.aendl; Coutsam1.b+sam2.bendl; 修改后的程序如下: #include class csample int main() csample sa

14、m1,sam2; sam1.Set(2,3); sam2.Set(5,6); sam1.Print(); sam2.Print(); coutsam1.a+sam2.aendl; coutsam1.b+sam2.bendl; return 0; 程序运行的结果: a+b=5 a+b=11 7 9 2.2 编写并调试程序 : 1) 按下面要求编程 定义一个描述学生基本情况的类,数据成员包括姓名、学号、英语、数学、计算机成绩。 成员函数包括设置姓名、学号和三门课程的成绩、输出数据、以及求平均值。 设计主函数,在主函数里调用设置 “姓名、学号和三门课程的成绩 ”的成员函数设置各数据 调用输出数据成员

15、函数, 实现各数据的输出; 调用求平均值的成员函数, 求三门课的平均成 绩,并输出显示。 程序如下 : #include class student ; void main() 运行结果: 2) 按下面要求编程 定义一个满足下列要求的类 CDate; a. 有三个成员数据:年、月、日; b. 有设置日期的成员函数; c. 有用格式 “月日年 ”输出日期的成员函数; d. 有对当前日期加一天的成员。 设计主函数,在主函数里创建对象;调用设置日期的成员函数,设置当天的日期;调用输出 日期的成员函数输出当天日期; 调用对当前日期加一天的成员函数, 然后再调用输出日期的 成员函数,输出第二天的日期。

16、程序如下: #include class CDate void main() 运行结果: 3.有一个类说明如下: Class fun int I,j; Public: Int s,k; Void SetData(int,int,int,int); Void print(); ; 要求: a. 完成函数 SetData(int,int,int,int) 的定义, 该函数用于设置各成员数据; 完成函数 void print() 的定义;该函数用于输出各成员数据; b. 设计主函数,在主函数里定义两个对象: Fun s1,s2; print() 成员函数输出数 c. 在主函数里调用SetDataO成

17、员函数,设置各个对象的数据,调用 据成员函数,实现各对象的数据的输出。 程序如下: #include class fun int i,j; public: int s,k; void SetData(int,int,int,int); void print(); ; void fun:SetData(int a,int b,int c,int d) void fun:print() int main() fun s1,s2; s1.SetData(1,2,3,4); s2.SetData(5,6,7,8); s1.print(); s2.print(); return 0; 运行结果: 3.实

18、验总结: 实验四 成员函数的重载 1、实验目的及要求: 1) 掌握普通函数重载的方法 2) 掌握成员函数重载的方法 2、实验内容: 2.1 分析下面程序,指出程序运行的结果 #include class ListClass int *List; unsigned nMax; unsigned nElem; public: void Init(int n=10) List=new int n; nMax=n; nElem=0; int Elem(int); int unsigned Elem(void)return nElem; unsigned Max(void)return nMax; vo

19、id Print(void); int GetElem(int i) if (i=0) else return 0; void Destroy(void) delete nMaxList; ; int ListClass:Elem(int elem) if(nElemnMax) ListnElem+=elem; return nElem; Else int *list; list=new int nMax+1; for(int i=0;inElem;i+) listi=Listi; delete nMaxList; nMax+; List=list; ListnElem+=elem; retu

20、rn nElem; void ListClass:Print(void)/输出数组内容 for(int i=0;inElem;i+) coutListit; coutn; void main(void) ListClass list,list1; list.Init(10); list1.Init(20); for(int i=0;i10;i+) list1.Elem(i); cout 线性表 list 的元素的个数为: list.Elem()n; cout 线性表 list 长度为: list.Max()n; cout 线性表 list1 的元素的个数为: list1.Elem()n; co

21、ut 线性表 list1 的长度为: list1.Max()n; list1.Print(); list1.Elem(3u)=100; cout 现在线性表 list1 中的第三个值为: list1.Elem(3u)n; list1.Elem(20); list1.Elem(200); cout 现在线性表 list1 中的最后一个元素为: list1.GetElem(list1.Elem()-1)n; list.Destroy(); list1.Destroy(); 运行结果 : 2.2 按下面的要求编写并调试程序: 1) 使用函数重载的方法定义两个重名函数,分别求出整型数的两点间距离和实型

22、数的两点间 距离。 程序如下: 运行结果 : 2) 定义一个 Cpoint 类,用成员函数的重载实现上题的功能。并编写主函数测试。 程序如下 : 实验结果: 3) 使用重载的方法编写一个求整数、 和双精度数的平方数的类。 并用一个主函数进行测试。 程序如下: #include class Squar ; void main() Squar c; cout2 的平方是 : c.squ(2)endl; cout1.1 的平方是 : c.squ(1.1)endl; cout1000 的平方是 : c.squ(1000)endl; 运行结果: 3实验总结: 实验五 构造函数与析构函数 1、实验目的:

23、1)掌握构造函数和析构函数定义方法; 2)掌握构造函数的重载、具有默认值的构造函数的使用方法; 3) 加深对构造函数的特殊用途的理解。 2、实验内容: 2 1 分析程序指出程序运行的结果: 1)分析下面程序中的对象传递,写出输出结果。 #include Using std:cout; Using std:endl; class Cylinder public: Cylinder() Cylinder(double r,double h); void setcylinder(double r,double h); double getradius()return radius; double g

24、etheight()return height; double volume(); double surface_area(); private: double radius; double height; ; const double PI=3.1415926; Cylinder:Cylinder(double r,double h) radius=r; height=h; void Cylinder:setcylinder(double r,double h) radius=r; height=h; double Cylinder:volume() double vol; vol=PI*r

25、adius*radius*height; return vol; double Cylinder:surface_area() double area; area=2*PI*radius*height+2*PI*radius*radius; return area; void main() Cylinder cylinder1(7.0,12.0),cylinder2; cylinder2.setcylinder(12.3,18.7); coutthe radius of cylinder1 is:tcylinder1.getradius()endl; coutthe height of cyl

26、inder1 is:tcylinder1.getheight()endl; coutthe volume of cylinder1 is:tcylinder1.volume()endl; coutthe surfacearea of cylinder1 is:tcylinder1.surface_area()endl; coutthe radius of cylinder2 is:tcylinder2.getradius()endl; coutthe height of cylinder2 is:tcylinder2.getheight()endl; coutthe volume of cyl

27、inder2 is:tcylinder2.volume()endl; coutthe surfacearea of cylinder2 is:tcylinder2.surface_area()endl 运行结果 : 2) 分析下面的程序,指出程序的错误。 #include #include class Sample int i; public: int j; Sample(int x) i=x;/couti=iendl; Sample() exit(1); cout 撤消 endl; ; void main() Sample a1(10),a2(20); exit(1) ; cout 撤消 e

28、ndl; 3)将下面的程序补充完整 #include class test private: int num; double f1; public: test(); test( ); getint()return num; double getfloat()return f1; ; test: test() cout 默认初始化 endl; cout 调用构造函数 1endl; num =0; f1 =0.0; test: test( ) cout 初始化 endl; cout 调用构造函数 2endl; void main() test a; test b(2,5.5); 2 2 编写并调试

29、程序 编写一个实现两个数相减的类的测试程序,请写出类的定义,构成一个完整的程序, 要求调用类的构造函数和析构函数时均有明确的输出信息。 #include Using std:cout; Using std:endl; class Cha int a,b; public: Cha(int,int); void print(); ; Cha:Cha(int x,int y) void Cha:print() void main() Cha t(88,32); t.print(); 程序运行结果: 3.实验总结 : 对象成员 *this 指针等相关知识。 实验六 1、实验目的及要求 1)理解对象成员

30、的概念 2)掌握对象成员的初始化方法 2、预习对象成员,对象成员的创建和使用, 3、 实验内容 1 分析调试程序指出程序运行的结果 1)分析下面程序中对象传递 ,写出输出结果 . #include class A int i; public:A(int x) i=x; int get() return i; ; int cube(A a) return a.get()*a.get(); void main() A a1(10),a2(20); coutcube(a1)endl; coutcube(a2)endl; 实验结果 : 2)分析对象成员的调用 ,写出程序结果 #include #inc

31、lude class B private: int a,b; public: B() B(int i,int j); void showb(); ; class A private: B c; public: A() A(int i,int j); void showa() a=i; b=j; ; A:A(int i,int j):c(i,j) void A:showa() c.showb(); B:B(int i,int j) a=i; b=j; void B:showb() couta=,tb=endl; void main() A a1(5,6); a1.showa(); 实验结果 :

32、2.编写程序 tria,顶点为其 编写一类 Cpoint 表示一个点的信息 ,在次基础上编写一个表示三角形的类 对象成员 ,编写完整的程序输出三角形面积 . #include #include class Ctria ; void main() Ctria a1; a1.SetData(3,4,5); cout 三角形面积 =a1.Area()endl; 输出结果 : 4、实验总结 : 实验七 成员函数和友员函数 1. 实验目的 1) 掌握const对象,const成员函数和const成员数据的使用; 2) 掌握友员函数的定义和使用。 2实验内容: 2 1 分析程序指出程序运行的结果: #in

33、clude class Sample int n; public: Sample(int i) n=i; void setvalue(int i) n=i; void display() coutn=znendl; ; void main() Sample s(5); s.setvalue(8); s.display(); 程序运行结果 : 2.2 编写并调试程序 1)编写一个程序求直角坐标中一个点到直线的距离。要求设计一个点类point, 含有两个公有成员数据x和y,代表点的坐标。另一个类为直线类line,它有三 个私有成员数据a,d,a分别代表直线方程ax+by+c=O的系数。在类line

34、中设计 一个友元函数distanee计算一个点到直线的距离。点(x,y)到直线ax+by+c=O 的距离distanee的计算公式如下: distance=|ax+by+c|/sqrt(a*a+b*b) 请根据下面给出的部分程序编写直线类line及其成员函数,以组成完整的程序 #include #include class point public: float x,y; point(float i,float j) x=i; y=j; ; void main() point p1(2,4); line l1(1,2,3); coutdistance=distance(p1,l1)endl;

35、程序运行结果 : 2)编写一类 Cpoint 表示一个点的信息。 在此基础上编写一个表示三角形的类 tria, 定点为其对 象成员。编写完整的程序输出三角形的面积。要求用友元函数来实现三角形面积的输出。 程序如下 : #include #include class Cpoint public: float a1,b1; Cpoint(float i,float j) a1=i; b1=j; ; class tria double L1,L2,L3,s; public: double area; Cpoint A,B,C; tria(float a,float b,float c,float d

36、,float e,float f):A( a,b),B(c,d),C(e,f) L1=sqrt(A.a1-B.a1)*(A.a1-B.a1)+(A.b1-B.b1)*(A.b1-B.b1); L2=sqrt(A.a1-C.a1)*(A.a1-C.a1)+(A.b1-C.b1)*(A.b1-C.b1); L3=sqrt(B.a1-C.a1)*(B.a1-C.a1)+(B.b1-C.b1)*(B.b1-C.b1); double are() s=(L1+L2+L3)/2); area=sqrt(s*(s-L1)*(s-L2)*(s-L3); return area; friend void pri

37、nt(tria D); ; void print(tria D) cout 三角形面积为 : D.arean; void main() tria D(4.0,2.0,3.0,4.0,5.0,6.0); D.are(); print(D); 程序运行结果 : 3 实验总结 : 实验八 静态成员 1、实验目的: 1) 掌握静态成员数据的定义及使用; 2) 掌握静态成员数据的定义及使用。 2、实验内容: 2 1 分析下面的程序,指出程序运行的结果。 #include class Sample int a,b; static int c; public: Sample() a=b=0; c+; voi

38、d show() couta=a,b=b,c=cendl; ; int Sample:c=1; void main() Sample a1,a2; a1.show(); a2.show(); 程序运行结果如下: 简要分析: 1、静态成员是类的一个成员,在创建对象前就为它分配了内存空间,并且它的数值是供所 有对象共享的一种特殊的成员。 2、静态成员包括静态成员数据和静态成员函数。 3、静态成员函数必须要有确定的值,而且必须在类体内声明一次。由于在类定义中不能对 成员数据据直接进行初始化, 因此必须在类体外再声明一次并进行初始化。 在类体内声明时, 静态成员数据和静态成员函数前都必须加关键字sta

39、tic,而在类体外声明时就不用再写了。 2 2 编写并调试程序。 1)编写一个名为score的类,用于统计一个班的学生成绩。其中使用一个静态成 员数据totals来存储总分及一个静态成员函数re_totals()返回该总分。并编写相应 的测试程序。 程序编写如下: #include class score int mark10; public: static int tals; static int num; static int re_tals() return tals; void set() int i; for(i=0;imarki; tals=tals+marki; num+; co

40、utThe scores of the class are following: endl; for(i=0;i10;i+) coutmarki ; coutn; int get_num(void) return num; ; int score:tals=0; int score:num=0; void main() score t; coutPlease input the scores of the class:endl; t.set(); coutThe number of the scores is: t.get_num()endl; coutThe total score of t

41、he class is: t.re_tals()endl; 程序运行结果 : 2)编写一个名为 foball 的类,用于统计一个班的学生成绩。 其中使用一个静态 成员数据 totals 来存储总分及一个静态成员函数 re_totals() 返回该总分。并 编写相应的测试程序。 程序编写如下: #include class foball int mark10; public: static int num; static int tals; static int re_tals() return tals; void set() int i; for(i=0;imarki; tals=tals+

42、marki; num+; coutThe scores of the class are following: endl; for(i=0;i10;i+) coutmarki ; coutn; int get_num(void) return num; ; int foball: tals=0; int foball:num=0; void main() foball t; coutPlease input the scores of the class:endl; t.set(); coutThe number of the scores is: t.get_num()endl; coutT

43、he total score of the class is: t.re_tals()endl; 程序运行结果: 3、实验总结: 实验九 继承 1、实验目的 1)掌握继承的实现方法 ; 2)继承中常见问题的处理方法。 2、实验内容 2.1 分析下面的程序,指出程序运行的结果 1)分析下面的程序,指出程序运行的结果: 1 #include class CBase public: void fn1(); ; void CBase:fn1() cout 调用基类类的函数 fn1()n; class CDerived:public CBase public: void fn1(); ; void CD

44、erived:fn1() coutfn1(); pd.fn1(); 2运行结果: 3)分析下面的程序,指出程序运行的结果: 1 #include class CBase1 int x; public: CBase1() x=0;cout 调用构造函数 CBase1()!n; CBase1(int a) x=1;cout 调用构造函数 CBase1(int)!n; CBase1()cout 调用析构函数 CBase1()!n; ; class CBase2 int y; public: CBase2() y=0;cout 调用构造函数 CBase2()!n; CBase2(int a) y=a;

45、cout 调用构造函数 CBase2(int)!n; CBase2()cout 调用析构函数 CBase2()!n; ; class A int x; public: A()x=0;cout 调用构造函数 A()!n; A(int a)x=a;cout 调用构造函数 A(int)!n; A()cout 调用析构函数 A()!n; ; class CDerived:public CBase1,virtual public CBase2 A a; public: CDerived() cout 调用构造函数 CDerived()!n; CDerived(int x,int y,int z):a(x

46、),CBase1(y),CBase2(z) cout 调用构造函数 CDerived(int,int,int)!n; CDerived()cout 调用析构函数 CDerived()!n; ; void main() CDerived *x=new CDerived; CDerived y(2,3,4); delete x; coutmain() 函数结束 !n; 实验结果: 2.2 编写并调试程序: 1)定义一个图形类,其中有保护类型的成员数据:高度和宽度,一个公有的构 造函数。由该图形类建立两个派生类:矩形类和等腰三角形类。在每个派生类中 都包含一个函数area(),分别用来计算矩形和等腰

47、三角形的面积。 1程序设计如下: #include class picture protected: double h,w; public: picture (double i,double j)h=i;w=j; ; class jpicture:public picture double mi; public: ; class sanjiaoxing:public picture double mi; public: ; void main() jpicture a(1,2); sanjiaoxing b(3,4); a. area(); b. area(); 2实验结果: 2)定义一个人员

48、类 cpeople,其属性有(保护类型):姓名、性别、年龄;从中派生出学生 类cstudent,添加属性:学号、入学时间和入学成绩;从cpeople类再派生出教师类 cteacher, 添加属性:职务、部门、工作时间;有cstudent类派生研究生类 cgraduate,添加属性:研究 方向和导师,由 cgraduate 和 cteacher 共同派生出在职研究生类 cgradonwork ,分别定义其中 的构造函数和输出函数。主函数中定义各种类的对象,并完成测试。 1程序设计如下: 2实验结果: 3、实验结论: 实验十 运算符重载 1. 实验目的及要求 1) 掌握运算符重载的基本概念和方法。

49、 2) 熟习几种特殊的运算符的重载。 2. 实验内容 1. 分析下面的程序 ,指出程序运行的结果 : #include class point int x,y; public: point(int vx,int vy) x=vx; y=vy; point()x=0,y=0; point operator+(point p1) int px=x+p1.x; int py=y+p1.y; return point(px,py); point operator-(point p1) point p; int px=x-p1.x; int py=y-p1.y; return point(px,py);

50、 void print()coutx,yendl; ; void main(void) point p1(10,10),p2(20,20); p1=p1+p2; p1.print(); /p2.print(); /p3.print(); 程序分析 : 运行结果为 : 3) 分析下面程序 , 指出程序运行的结果 #include static int dys=31,28,31,30,31,30,31,31,30,31,30,31; class date int mo,da,yr; public: date(int m,int d,int y)mo=m;da=d;yr=y; date() void

51、 disp() coutmo/da/yrendl; date operator+(int day) date dt=*this; day+=dt.da;/coutdaydysdt.mo-1) day-=dysdt.mo-1;/coutdayendl; if(+dt.mo=13) dt.mo=1; dt.yr+; /coutdayendl; /dt.disp(); dt.da=day; return dt; ; void main(void) date d1(5,31,2009),d2; /d1.disp(); d2=d1+20; d2.disp(); 程序运行结果 : 三 . 编写并调试程序

52、. 定义一个描述平面上一个点的类 point ,重载 “+”和“-”运算符,并区分这 两种运算符的前置和后置操作,构成一个完整的程序。 程序代码: 程序运行的结果是 : 2)构造一个分数类rationalNumber,该类中包括分子和分母两个成员数据,并具 有下述功能: 1 建立构造函数,它能防止分母为 0,当分数不是最简形式时进行约分,并避免 分母为负数。 2 重载加法、减法、乘法和除法运算符。 3 重载关系运算符: 、 、=等。 程序代码: 程序执行的结果为 实验十一 虚函数 一、实验目的 1)掌握虚函数的定义和使用 2)掌握抽象类的定义和使用 3)掌握纯虚函数的定义 4)掌握虚析构函数、

53、纯虚函数和抽象类的作用 二、实验原理 1利用虚函数的作用:当编译器编译虚函数时,编译系统将用动态连接的方式 进行编译。 即在编译时不确定该虚函数的版本, 而是利用一种机制在运动过程中 根据其所指向的实例决定使用哪一个函数版本。 2利用虚析构函数的原则: 当将基类指针或引用 new 运算符指向派生类对象时, 为了在释放派生类对象时能调用派生类的析构函数, 必须将基类的析构函数定义 为虚函数。 3抽象类的作用:为它的所有派生类提供一个公共接口,纯虚函数是定义抽象 类的一种间接手段。 三、实验设备 实验室里调备的计算机、 window xp,visual c+6.0 四、实验内容 41 分析下面各题

54、程序,按各题的要求进行实验 1)分析下面的程序,指出程序运行的结果: #include class CBase public: virtual void f1()/将成员函数 f1() 声明为虚函数 cout 调用函数 CBase:f1()!endl; virtual void f2()/将成员函数 f2() 声明为虚函数 cout 调用函数 CBase:f2()!endl; void f3()/ 一般成员函数 cout 调用函数 CBase:f3()!endl; ; class CDerived:public CBase/公有继承 CBase void f1() cout 调用函数 CDer

55、ived:f1()!endl; void f2() cout 调用函数 CDerived:f2()!endl; void f3() cout 调用函数 CDerived:f3()!f1(); /通过 p 调用基类版本的 f1() 函数 p-f2(); /通过 p 调用基类版本的 f2() 函数 p-f3(); /通过 p 调用基类版本的 f3() 函数 p= /将派生类对象 obj2 的地址赋给 p p-f1(); /动态连接,调用派生类版本 p-f2(); /动态连接,调用派生类版本 p-f3(); / 调用基类版本 运行的结果 : 2)分析下面的程序,指出程序运行的结果: #include

56、 class CBase public: CBase() cout 调用构造函数 fun(); virtual void fun() cout 调用构造函数 /CBase 类的构造函数 CBase()!endl; / 构造函数中调用虚函数 fun() /定义虚函数 CBase:fun()!endl; ; class CDerived:public CBase public: CDerived() cout 调用构造函数 fun(); void fun() cout 调用构造函数 ; void main() CDerived d; d.fun(); 运行结果 : /CDerived 类的构造函数

57、 CDerived()!endl; /构造函数中调用虚函数 fun() CDerived:fun()!endl; /创建对象 3)分析下面的程序,指出程序的错误 #include #include class CBase protected: char *ch; public: CBase(char *x) ch=new char20; strcpy(ch,x); virtual void fun()=0; virtual void fun1() coutxendl; /虚函数 coutchendl; CBase() deletech; coutCBase()endl; ; class CDe

58、rived:public CBase protected: char *ch; public: CDerived (char *x,char*y):CBase(y) ch=new char20; strcpy(ch,x); void fun1() / coutxendl; coutchendl; Virtual CDerived() deletech; coutCDerived()fun1(); p-fun(); p=new CDerived(China,Hello); p-fun1(); p-fun(); delete p; 运行结果 : 4 2 编写并调试程序 1)编写一个程序计算三角,正

59、方形和圆形的面积。 分析:依题意,可以抽象出一个基类 CBase,在其中说明一个虚函数,用来求面积,并利用 单接口、多实现版本设计各个图形求面积的方法。 源程序: 运行结果: 2)编写一个程序计算正方形、球体和圆柱体的表面积和体积。 分析:依题意,抽象出一个公共基类 CContaineer 为抽象类,在其中定义求表面积和体积的 虚函数 (该抽象类本身没有表面积和体积可言) 。抽象类中定义一个公共的数据成员 radius, 此数据可作为球体的半径、 正方形的边长、 圆柱体底面积圆半径。 由此抽象类派生出要描述 的三个类,在这三个类中都具有求表面积和体积的重定义版本。 源程序: 运行结果 : 实验总结: 实验十二 函数模板与类模板 一、 实验目的 1理解

温馨提示

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

最新文档

评论

0/150

提交评论