实验二类与对象实验目的和要求1.掌握类、类的数据成员、类的成员函数的定义方式。
2.理解类成员的访问控制方式。
3.掌握对象的定义和操作对象的方法。
4.理解构造函数和析构函数的定义与执行过程。
5.掌握重载构造函数的方法。
6.了解拷贝构造函数的定义方法。
实验容1.下面程序中有错,在不删除和增加代码行的情况下,改正错误语句,使其正确运行。
#include<iostream.h>class Aa{public:Aa(int i=0){a=i;cout<<"Constructor "<<a<<endl;}~Aa(){cout<<"Destructor "<<a<<endl;}void print(){cout<<a<<endl;}private:int a;};int main(){Aa al(1),a2(2);al.print();cout<<a2.a<<endl;return 0;}2.检查下面的程序,找出其中的错误,并改正。
然后上机调试,使程序能正常运行。
(1)#include<iostream.h>class Date{void set_date();void show_date();int year;int month;int day;};Date d;int main(){set_date();show_date();}void set_date(){cin>>d.year;cin>>d.month;cin>>d.day;}void show_date(){cout<<d.year<<'/'<<d.month<<'/'<<d.day<<endl; }(2)#include<iostream.h>class A{public:void A(int i=0){m=i;}void show(){cout<<m<<endl;}void ~A(){}private:int m;};int main(){A a(5);a.m+=10;a.show();return 0;}(3)#include<iostream.h> class X{private: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(){X x1;X x2(2);X x3(1,2);x1.setA(3);}3.调试下列程序。
#include<iostream.h>class TPoint{private:int X,Y;public:TPoint(int x,int y){X=x;Y=y;cout<<"Constructor is called"<<endl;}TPoint(TPoint &p);~TPoint(){ cout<<"Destructor is called"<<endl; }int getx(){ return X; }int gety(){ return Y; }};TPoint::TPoint(TPoint &p){X=p.X;Y=p.Y;cout<<"Copy-initialization Constructor is called"<<endl;}void main(){TPoint p1(4,9);TPoint p2(p1);TPoint p3 = p2;cout<<"p3=("<<p3.getx()<<","<<p3.gety()<<")"<<endl;}(1)写出程序的输出结果,并解释输出结果。
(2)按下列要求进行调试:在主函数体,添加下列说明语句:TPoint p4,p5(2);调试程序会出现什么现象?为什么?如何解决?(提示:对已有的构造函数进行适当修改)结合运行结果分析如何使用不同的构造函数创建不同的对象。
(3)在主函数使用new创建不同参数动态两个动态对象,输出其坐标,并用delete 删除之。
运行程序,分析运行结果。
(4)在程序中定义个全局对象,在主函数最前添加语句:cout<<"Enter main"<<endl;运行程序,分析运行结果。
4.完善程序,并写出运行结果根据程序要求,完善程序后输入源程序,编译连接,并写出运行结果。
如果某个自然数除了1和它本身外还有其他因子,则这个自然数就是合数(非素数)。
试定义一个类NUM,从3开始向上试探找出n个连续的自然数,且它们都是合数。
当找到第一组连续的n个合数后,即停止查找。
具体要求如下:(1)私有成员int n : 存放满足条件的连续自然数的个数。
int *p: 根据n的值申请一个动态数组用来存放求出的满足条件的n个自然数。
(2)公有成员函数NUM(int n1): 构造函数,用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 <iostream.h>class NUM{ //定义数据类NUMprivate: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( &&j<n){p[j]=i;j++;i++;}if(j==n)break;}}void print(void){cout<<"找到的"<<n<<"个连续合数为:"<<endl;for(int i=0;i<n;i++)cout<<p[i]<<" ";cout<<endl;}~NUM(){; //释放在构造函数中申请的存储空间}};void main(){cout<<"请输入要求的连续合数的个数(例如10):";int n;cin>>n;NUM num(n);; //寻找连续的合数,并存入动态申请的存储空间中; //输出寻找到的合数}5.请定义一个矩形类(Rectangle),私有数据成员为矩形的长度( len)和宽度(wid),缺省构造函数置len和wid为0,有参构造函数置len和wid为对应形参的值,另外还包括求矩形周长、求矩形面积、取矩形长度和宽度、修改矩形长度和宽度为对应形参的值、输出矩形尺寸等公有成员函数。
要求输出矩形尺寸的格式为“length:长度,width:宽度”。
编写主函数对定义的类进行测试。
6.声明一个时间类,时间类中有3个私有数据成员(Hour,Minute,Second)和两个公有成员函数(SetTime和PrintTime)。
SetTime根据传递的3个参数为对象设置时间;PrintTime 负责将对象表示的时间显示输出,输出格式为“Hour:Minute:Second”。
(1)在主函数中,建立一个时间类的对象,设置时间为9点20分30秒并显示该时间。
(2)使用构造函数代替上面的SetTime成员函数,并在主函数中使用构造函数设置时间为10点40分50秒,并显示该时间。
(3)重载时间类的构造函数(不带参数)使小时、分、秒均为0。
(4)在时间类的析构函数中输出"Good bye!”(5)定义拷贝构造函数并调用。
7.下面是一个整型链表类intList的声明,请给出该类所有数据成员的类外定义,并在主函数中测试该类。
class intList{protected:struct Node{int 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);//在链表中查找值为elem的元素,找到返回该元素在链表中的位置,否则返回0 int Length(); //返回链表长度(元素个数)void PrintList(); //输出链表};参考答案(非权威,仅仅是我自己的理解,如有错误,欢迎批评指正!)第一题:#include<iostream.h>class Aa{public:Aa(int i=0){a=i;cout<<"Constructor "<<a<<endl;}~Aa(){cout<<"Destructor "<<a<<endl;}void print(){cout<<a<<endl;}private:int a;};int main(){Aa al(1),a2(2);al.print();a2.print();return 0;}第二题(1)#include<iostream.h>class Date{public: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(){cin>>year;cin>>month;cin>>day;}void Date::show_date(){cout<<year<<'/'<<month<<'/'<<day<<endl; }(2)#include<iostream.h>class A{public:A(int i=0){m=i;}void show(){cout<<m<<endl;}~A(){}friend void add(A &);private:int m;};void add(A &a){a.m+=10;}int main(){A a(5);add(a);a.show();return 0;}(3)#include<iostream.h>class X{private: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()X x1;X x2(2);X x3(1,2);x1.setA(3);}第三题(1)void main(){TPoint p1(4,9); //调用构造函数初始化p1TPoint p2(p1); //显示调用拷贝构造函数初始化p2TPoint p3 = p2; //对象之间的赋值,由于之前没有定义p3,因此用另一个同类的对象给其赋值时,会调用拷贝构造函数。