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

实验目的和要求

  1、熟悉类的定义格式和类中成员的访问权限。

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

  3、掌握对象的定义以及对象的初始化的时机与方法。

实验内容

  1、下面程序sy3_1.cpp中用ERROR标明的语句有错吧,在不删除和增加代码行的情况下,改正错误语句,使其正确运行。

运行程序如下:

#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类的带有两个参数的构造函数进行修改,在函数体内增添下述语句:

      cout<<"Constructor is called\n";

(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<<"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类的带有两个参数的构造函数进行修改,在函数体内增添下述语句:

      cout<<"Constructor is called\n";

(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)按下列要求进行调试:

       在主函数体内,添加下列说明语句:

        TPoint p4,p5(2);

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

现象:

为什么:

如何解决:

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

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

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

(3)将语句 if(!pa1||!pa2) 改为if(!pa1||!pa2||!pa3)

(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;  
} 

运行结果如下:

解释:

猜你喜欢

转载自blog.csdn.net/long_2678485289/article/details/80049971