1、C实验二类与对象实验二 类与对象实验目的和要求1掌握类、类的数据成员、类的成员函数的定义方式。2理解类成员的访问控制方式。3掌握对象的定义和操作对象的方法。4理解构造函数和析构函数的定义与执行过程。5掌握重载构造函数的方法。6了解拷贝构造函数的定义方法。实验内容1下面程序中有错,在不删除和增加代码行的情况下,改正错误语句,使其正确运行。#includeclass Aapublic:Aa(int i=0)a=i;coutConstructor aendl;Aa()coutDestructor aendl;void print()coutaendl;private:int a;int main()
2、Aa al(1),a2(2);al.print();couta2.aendl;return 0;2检查下面的程序,找出其中的错误,并改正。然后上机调试,使程序能正常运行。(1)#includeclass Datevoid set_date();void show_date();int year;int month;int day;Date d;int main()set_date();show_date();void set_date()cind.year;cind.month;cind.day;void show_date()coutd.year/d.month/d.dayendl;(2)#
3、includeclass Apublic:void A(int i=0)m=i;void show()coutmendl;void A()private:int m;int main()Aa(5);a.m+=10;a.show(); return 0;(3)#includeclass Xprivate:int a=0;int &b;void setA(int i)a=i;X(int i)a=i;public:int X()a=b=0;X(int i,int j)a=i;b=j;void setC(int k)c=c+k;void main()Xx1; X x2(2);X x3(1,2); x1
4、.setA(3);3调试下列程序。#includeclass TPointprivate:int X,Y;public:TPoint(int x,int y)X=x;Y=y;coutConstructor is calledendl;TPoint(TPoint &p);TPoint() coutDestructor is calledendl; int getx() return X; int gety()return Y; ;TPoint:TPoint(TPoint &p)X=p.X;Y=p.Y;coutCopy-initialization Constructor is calledend
5、l;void main()TPoint p1(4,9);TPoint p2(p1);TPoint p3 = p2;coutp3=(p3.getx(),p3.gety()endl;(1)写出程序的输出结果,并解释输出结果。(2)按下列要求进行调试:在主函数体内,添加下列说明语句:TPoint p4,p5(2);调试程序会出现什么现象?为什么?如何解决? (提示:对已有的构造函数进行适当修改)结合运行结果分析如何使用不同的构造函数创建不同的对象。( 3)在主函数内使用 new 创建不同参数动态两个动态对象,输出其坐标,并用删除之。运行程序,分析运行结果。( 4)在程序中定义个全局对象,在主函数最前
6、添加语句:deletecoutEnter mainendl;运行程序,分析运行结果。4完善程序,并写出运行结果根据程序要求,完善程序后输入源程序,编译连接,并写出运行结果。如果某个自然数除了 1 和它本身外还有其他因子,则这个自然数就是合数(非素数) 。试定义一个类 NUM ,从 3 开始向上试探找出 n 个连续的自然数,且它们都是合数。当找到第一组连续的 n 个合数后,即停止查找。具体要求如下:( 1)私有成员int n :int *p:存放满足条件的连续自然数的个数。根据 n 的值申请一个动态数组用来存放求出的满足条件的n 个自然数。( 2)公有成员函数NUM(int n1): 构造函数,
7、用n1 初始化n,根据n 的值申请动态数组空间,使p 指向该动态数组空间。int yes(int x): 判断 x 是否为合数。如果是,返回 1,否则返回 0。void fun(): 从 3 开始向上试探找出 n 个连续的自然数, 且它们都是合数, 并依次存入动态数组。void print():输出满足条件的n 个合数。NUM(): 析构函数,释放动态数组所占用的存储空间。( 3)在主函数中定义一个 NUM 类的对象 num,求出 10 个连续的合数。 然后通过对象num 调用成员函数求出 10 个连续的合数,并输出计算结果。#include class NUM /定义数据类 NUM priv
8、ate:int n; int *p;public:NUM(int n1)n=n1;p= ; / 动态分配存放连续合数的存储空间int yes(int x)for(int i=2;i=x/2;i+)if (x%i=0)return 1;return 0;void fun(void)int j;for(int i=3;1;i+)j=0;while(&jn)pj=i;j+;i+;if(j=n)break;void print(void)cout 找到的 n 个连续合数为: endl;for(int i=0;in;i+)coutpi ;coutendl;NUM();/释放在构造函数中申请的存储空间;v
9、oid main()coutn;NUM num(n);/寻找连续的合数,并存入动态申请的存储空间中;/输出寻找到的合数5请定义一个矩形类 (Rectangle) ,私有数据成员为矩形的长度 ( len) 和宽度 (wid) ,缺省构造函数置 len 和 wid 为 0,有参构造函数置 len 和 wid 为对应形参的值,另外还包括求矩形周长、求矩形面积、取矩形长度和宽度、修改矩形长度和宽度为对应形参的值、输出矩形尺寸等公有成员函数。要求输出矩形尺寸的格式为“ length:长度, width :宽度”。编写主函数对定义的类进行测试。6声明一个时间类,时间类中有 3 个私有数据成员 (Hour,
10、 Minute ,Second)和两个公有成员函数 (SetTime 和 PrintTime) 。SetTime 根据传递的 3 个参数为对象设置时间; PrintTime 负责将对象表示的时间显示输出,输出格式为“ Hour : Minute : Second”。(1)在主函数中, 建立一个时间类的对象, 设置时间为 9 点 20 分 30 秒并显示该时间。(2)使用构造函数代替上面的 SetTime 成员函数,并在主函数中使用构造函数设置时间为 10 点 40 分 50 秒,并显示该时间。( 3)重载时间类的构造函数(不带参数)使小时、分、秒均为0。( 4)在时间类的析构函数中输出 Goo
11、d bye! ”( 5)定义拷贝构造函数并调用。7下面是一个整型链表类 intList 的声明,请给出该类所有数据成员的类外定义,并在主函数中测试该类。class intListprotected:struct Nodeint data;Node *next;Node *L;public:intList();/构造函数intList();/析构函数bool Insert(int i,int elem);bool Remove(int i,int &elem);/删除链表的第 i 个位置的元素,删除成功返回true,失败返回 falseint Find(int elem);/在链表中查找值为el
12、em 的元素,找到返回该元素在链表中的位置,否则返回0int Length();/返回链表长度(元素个数)void PrintList();/输出链表;参考答案(非权威,仅仅是我自己的理解, 如有错误,欢迎批评指正!)第一题:#includeclass Aapublic:Aa(int i=0)a=i;coutConstructor aendl;Aa()coutDestructor aendl;void print()coutaendl;private:int a;int main()Aa al(1),a2(2);al.print();a2.print();return 0;第二题(1)#inc
13、ludeclass Datepublic:void set_date();void show_date();private:int year;int month;int day;Date d;int main()d.set_date();d.show_date();return 0;void Date:set_date()cinyear;cinmonth;cinday;void Date:show_date()coutyear/month/dayendl;(2)#includeclass Apublic:A(int i=0)m=i;void show()coutmendl;A()friend
14、void add(A &);private:int m;void add(A &a)a.m+=10;int main()Aa(5);add(a);a.show(); return 0;(3)#includeclass Xprivate:int a,b,c;public:X(int i)a=i;X()a=b=0;X(int i,int j)a=i;b=j;void setC(int k)c=c+k;void setA(int i)a=i;void main()Xx1; X x2(2);X x3(1,2); x1.setA(3);第三题(1)void main()TPoint p1(4,9); /
15、调用构造函数初始化 p1TPoint p2(p1); /显示调用拷贝构造函数初始化 p2TPoint p3 = p2; /对象之间的赋值,由于之前没有定义 p3,因此用另一个同类的对象给其赋值时,会调用拷贝构造函数。coutp3=(p3.getx(),p3.gety()endl; /输出 p3 在赋值后的 x和 y(2)答:调试程序会程序错误, 原因是对于无输入的对象和只要一个输入值的对象没有相应的构造函数, 要解决也挺简单, 就是在说明部分加上相应的构造函数就可以了。修改后的程序如下:#includeclass TPointprivate:int X,Y;public:TPoint()X=Y
16、=0;coutA Constructor is calledendl;TPoint(int i)X=i;Y=0;coutB Constructor is calledendl;TPoint(int x,int y)X=x;Y=y;coutConstructor is calledendl;TPoint(TPoint &p);TPoint()coutDestructor is calledendl; int getx()return X;int gety()return Y;TPoint:TPoint(TPoint &p)X=p.X;Y=p.Y;coutCopy-initialization C
17、onstructor is calledendl;void main()TPoint p1(4,9);coutp1=(p1.getx(),p1.gety()endl;TPoint p2(p1);coutp2=(p2.getx(),p2.gety()endl;TPoint p3 = p2;coutp3=(p3.getx(),p3.gety()endl; TPoint p4,p5(2);coutp4=(p4.getx(),p4.gety()endl;coutp5=(p5.getx(),p5.gety()endl;(3)#includeclass TPointprivate:int X,Y;publ
18、ic:TPoint(int x,int y)X=x;Y=y;coutConstructor is calledendl;TPoint(TPoint &p);TPoint()coutDestructor is calledendl;int getx() return X; int gety() return Y; ;TPoint:TPoint(TPoint &p)X=p.X;Y=p.Y;coutCopy-initialization Constructor is calledendl;void main()TPoint *p1=new TPoint(4,9); coutp1=(getx(),ge
19、ty()endl; delete p1;(4)#includeclass TPointprivate:int X,Y;public:TPoint(int x,int y)X=x;Y=y;coutConstructor is calledendl;TPoint(TPoint &p);TPoint()coutDestructor is calledendl;int getx()int gety()return X; return Y;void ShowPoint()coutp1=(X,Y)endl;TPoint:TPoint(TPoint &p)X=p.X;Y=p.Y;coutCopy-initi
20、alization Constructor is calledendl;void main()coutEnter mainShowPoint();delete p1;第四题:#include class NUM /定义数据类 NUM private:int n;int *p;public:NUM(int n1)n=n1;p=new intn;/动态分配存放连续合数的存储空间int yes(int x)for(int i=2;i=x/2;i+)if (x%i=0) return 1;return 0;void fun(void)int j;for(int i=3;1;i+)j=0;while(y
21、es(i)&jn)pj=i;j+;i+;if(j=n) break;void print(void)cout找到的 n 个连续合数为: endl;for(int i=0;in;i+)coutpi ;coutendl;NUM()if(p) deletep; /释放在构造函数中申请的存储空间;void main()coutn;NUM num(n);num.fun(); /寻找连续的合数,并存入动态申请的存储空间中 num.print() ; /输出寻找到的合数第五题:#includeclass Rectangleprivate:int len,wid;public:Rectangle()len=w
22、id=0;coutFirst Constructor is calledendl;Rectangle(int i,int w)len=i;wid=w;coutSecond Constructor is calledlen;cinwid;int Get_Perimeter()return 2*(len+wid);int Get_Area()return len*wid;int get_len()return len;int get_wid()return wid;Rectangle()coutDestructor is calledendl;void main()int temp;Rectang
23、le rect,Default(8,9);coutendl;cout 默 认 长 度 : Default.get_len() , 默 认 宽 度 :Default.get_wid()endl;cout矩形的周长为: Default.Get_Perimeter()endl;cout矩形的面积为: Default.Get_Area()endl; coutendl;couttemp;while(temp=1)cout请输入矩形的长和宽: endl;rect.Set_Rectangle();cout 长 度 : rect.get_len() , 宽 度 :rect.get_wid()endl;cout矩形的周长为: rect.Get_Perimeter()endl; cout矩形的面积为: rect.Get_Area()endl; coutendl;couttemp;cout
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1