实验三 构造函数与析构函数

匿名 (未验证) 提交于 2019-12-03 00:32:02

实验目的和要求


实验内容

运行程序如下:

#include<iostream>   using namespace std;   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 a1(1),a2(2);       a1.print();      cout<<a2.a<<endl;//ERROR       return 0;   } 

错误如下:

修改程序如下:
#include<iostream>   using namespace std;   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 a1(1),a2(2);       a1.print();       a2.print();       return 0;   } 

运行结果如下:


2、调试下列程序:
#include<iostream>     using namespace std;     class TPoint     {     public:         TPoint(int x=0,int y=0){X=x,Y=y;}         TPoint(TPoint &p);         ~TPoint(){cout<<"Destructor is called\n";}         int getx(){return X;}         int gety(){return Y;}     private:         int X,Y;     };     TPoint::TPoint(TPoint &p)     {         X=p.X;         Y=p.Y;         cout<<"Copy-initialization Constructor is called\n";     }     int main()     {         TPoint p1(4,9);         TPoint p2(p1);         TPoint p3=p2;         TPoint p4,p5(2);         cout<<"p3=("<<p3.getx()<<","<<p3.gety()<<")\n";         return 0;     }

在程序中,将TPoint类的带有两个参数的构造函数进行修改,在函数体内增添下述语句:

(1)写出程序的输出结果,并解释输出结果;

程序如下:
#include<iostream>   using namespace std;   class TPoint   {   public:       TPoint(int x=0,int y=0){X=x,Y=y;}       TPoint(TPoint &p);       ~TPoint(){cout<<"Destructor is called\n";}       int getx(){return X;}       int gety(){return Y;}   private:       int X,Y;   };   TPoint::TPoint(TPoint &p)   {       X=p.X;       Y=p.Y;       cout<<"Constructor is called\n";       cout<<"Copy-initialization Constructor is called\n";   }   int main()   {       TPoint p1(4,9);       TPoint p2(p1);       TPoint p3=p2;       TPoint p4,p5(2);       cout<<"p3=("<<p3.getx()<<","<<p3.gety()<<")\n";       return 0;   }


运行结果如下:


(2)按下列要求进行调试:


#include<iostream>     using namespace std;     class TPoint     {     public:         TPoint(int x,int y){X=x,Y=y;}         TPoint(TPoint &p);         ~TPoint(){cout<<"Destructor is called\n";}         int getx(){return X;}         int gety(){return Y;}     private:         int X,Y;     };     TPoint::TPoint(TPoint &p)     {         X=p.X;         Y=p.Y;         cout<<"Copy-initialization Constructor is called\n";         cout<<"Constructor is called\n";     }     int main()     {         TPoint P4,P5(2);         TPoint p1(4,9);         TPoint p2(p1);         TPoint p3=p2;         cout<<"p3=("<<p3.getx()<<","<<p3.gety()<<")\n";         return 0;     }


调试程序会出现什么现象?为什么?如何解决?(提示:对已有的构造函数进行适当修改)结合运行结果分析如何使用不同的构造函数创建不同的对象。

现象:

为什么:因为在类中没有定义不带参数和带一个参数的构造函数;

如何解决:

//sy3_2.cpp     #include<iostream>     using namespace std;     class TPoint     {     public:         TPoint(int x=0,int y=0){X=x,Y=y;}         TPoint(TPoint &p);         ~TPoint(){cout<<"Destructor is called\n";}         int getx(){return X;}         int gety(){return Y;}     private:         int X,Y;     };     TPoint::TPoint(TPoint &p)     {         X=p.X;         Y=p.Y;         cout<<"Copy-initialization Constructor is called\n";         cout<<"Constructor is called\n";     }     int main()     {         TPoint P4,P5(2);         TPoint p1(4,9);         TPoint p2(p1);         TPoint p3=p2;         cout<<"p3=("<<p3.getx()<<","<<p3.gety()<<")\n";         return 0;     }  

结果:

3、对教材中Li3_11.cpp的主函数做如下修改:

(1)将Heapclass *pa1,*pa2 改为Heapclass *pa1,*pa2,*pa3;

(2)在语句pa2=new Heapclass 后增加语句pa3=new Heapclass(5);

(4)在语句delete pa2 后增加语句delete pa3;

写出程序的输出结果,并解释输出结果。

程序如下:

    #include<iostream>       using namespace std;       class Heapclass       {       public:          Heapclass(int x);          Heapclass();          ~Heapclass();       private:           int i;       };       Heapclass::Heapclass(int x)       {           i=x;           cout<<"Contstructor is called. "<<i<<endl;       }       Heapclass::Heapclass()       {           cout<<"Default Contstructor is called."<<endl;       }       Heapclass::~Heapclass()       {        cout<<"Default is called."<<endl;       }       int main()       {          Heapclass *pa1,*pa2,*pa3;          pa1=new Heapclass(4);          pa2=new Heapclass;          pa3=new Heapclass(5);          if(!pa1||!pa2||!pa3)          {              cout<<"Out of Mcmory!"<<endl;              return 0;          }          cout<<"Exit main"<<endl;          delete pa1;          delete pa2;          delete pa3;          return 0;       }  

运行结果如下:



pa1、pa2、pa3中是2个指向类Heapclass的对象指针,在能够赋给它们足够内存的情况下,使用运算符new给它们赋值,同时对它们所指向的对象进行初始化。使用delete释放这三个指针所指向的对象,由于不能够赋给pa1、pa2或pa3足够内存,所以输出“Out of Memory”。

4、请定义一个矩形类(Rectangle),私有数据成员为矩形的长度(len)和宽度(wid),无参构造函数置len和wid为0,有参构造函数置len和wid为对应形参的值,另外还包括求矩形周长、取矩形面积、取矩形长度和宽度、修改矩形长度和宽度为对应形参的值、输出矩形尺寸等公有成员函数。要求输出矩形尺寸的格式为“length:长度,width:宽度”。
程序如下:
#include<iostream>     using namespace std;     class Rectangle     {     public:        Rectangle()        {            len=0;            wid=0;        }        Rectangle(double Len,double Wid)        {            len=Len;            wid=Wid;         }        double Circumference()        {            return 2*(len+wid);         }        double Area()        {            return len*wid;         }        double getl()        {            return len;         }        double getw()        {            return wid;         }        void charge(double a,double b)        {            len=a;            wid=b;         }        void s()        {            cout<<"length:"<<len<<"  "<<"width:"<<wid<<endl;         }     private:         int len,wid;     };     int main()     {       Rectangle q;       Rectangle h(5.0,2.0);       cout<<"q的矩形尺寸:"<<endl;       q.s();       cout<<"h的矩形尺寸:"<<endl;       h.s();       cout<<"h的周长:"<<h.Circumference()<<endl;       cout<<"h的面积:"<<h.Area()<<endl;       cout<<"h的长度:"<<h.getl()<<endl;       cout<<"h的宽度:"<<h.getw()<<endl;       h.charge(8.0,6.0);       cout<<"修改后的矩形的尺寸:"<<endl;        h.s();        return 0;     }


结果如下:


分析与讨论


1、类中私有成员的访问权限。

2、构造函数与析构函数的调用顺序。

3、何时进行对象初始化?如何进行?(提示:注意分一般对象和堆对象讨论)

使用运算符new分配内存,调用构造函数来进行初始化。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!