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

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

实验目的和要求

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

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

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

实验内容

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

运行程序如下:

  1.   
  1. #include<iostream>  
  2. using namespace std;  
  3. class Aa  
  4. {  
  5.   public:  
  6.       Aa(int i=0){a=i;cout<<"Constructor"<<a<<endl;}  
  7.       ~Aa(){cout<<"Destructor"<<a<<endl;}  
  8.       void print(){cout<<a<<endl;}  
  9.   private:  
  10.     int a;  
  11. };  
  12. int main()  
  13. {  
  14.     Aa a1(1),a2(2);  
  15.     a1.print();  
  16.    cout<<a2.a<<endl;//ERROR  
  17.     return 0;  
  18. }  
错误如下:
修改程序如下:
  1. #include<iostream>  
  2. using namespace std;  
  3. class Aa  
  4. {  
  5.   public:  
  6.       Aa(int i=0){a=i;cout<<"Constructor"<<a<<endl;}  
  7.       ~Aa(){cout<<"Destructor"<<a<<endl;}  
  8.       void print(){cout<<a<<endl;}  
  9.   private:  
  10.     int a;  
  11. };  
  12. int main()  
  13. {  
  14.     Aa a1(1),a2(2);  
  15.     a1.print();  
  16.     a2.print();  
  17.     return 0;  
  18. }  
运行结果如下:

2、调试下列程序:
  1. #include<iostream>    
  2. using namespace std;    
  3. class TPoint    
  4. {    
  5. public:    
  6.     TPoint(int x=0,int y=0){X=x,Y=y;}    
  7.     TPoint(TPoint &p);    
  8.     ~TPoint(){cout<<"Destructor is called\n";}    
  9.     int getx(){return X;}    
  10.     int gety(){return Y;}    
  11. private:    
  12.     int X,Y;    
  13. };    
  14. TPoint::TPoint(TPoint &p)    
  15. {    
  16.     X=p.X;    
  17.     Y=p.Y;    
  18.     cout<<"Copy-initialization Constructor is called\n";    
  19. }    
  20. int main()    
  21. {    
  22.     TPoint p1(4,9);    
  23.     TPoint p2(p1);    
  24.     TPoint p3=p2;    
  25.     TPoint p4,p5(2);    
  26.     cout<<"p3=("<<p3.getx()<<","<<p3.gety()<<")\n";    
  27.     return 0;    
  28. }    

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

      cout<<"Constructor is called\n";

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

程序如下:
  1. #include<iostream>  
  2. using namespace std;  
  3. class TPoint  
  4. {  
  5. public:  
  6.     TPoint(int x=0,int y=0){X=x,Y=y;}  
  7.     TPoint(TPoint &p);  
  8.     ~TPoint(){cout<<"Destructor is called\n";}  
  9.     int getx(){return X;}  
  10.     int gety(){return Y;}  
  11. private:  
  12.     int X,Y;  
  13. };  
  14. TPoint::TPoint(TPoint &p)  
  15. {  
  16.     X=p.X;  
  17.     Y=p.Y;  
  18.     cout<<"Constructor is called\n";  
  19.     cout<<"Copy-initialization Constructor is called\n";  
  20. }  
  21. int main()  
  22. {  
  23.     TPoint p1(4,9);  
  24.     TPoint p2(p1);  
  25.     TPoint p3=p2;  
  26.     TPoint p4,p5(2);  
  27.     cout<<"p3=("<<p3.getx()<<","<<p3.gety()<<")\n";  
  28.     return 0;  
  29. }  

运行结果如下:

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

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

      TPoint p4,p5(2);

  1.   
  1. #include<iostream>    
  2. using namespace std;    
  3. class TPoint    
  4. {    
  5. public:    
  6.     TPoint(int x,int y){X=x,Y=y;}    
  7.     TPoint(TPoint &p);    
  8.     ~TPoint(){cout<<"Destructor is called\n";}    
  9.     int getx(){return X;}    
  10.     int gety(){return Y;}    
  11. private:    
  12.     int X,Y;    
  13. };    
  14. TPoint::TPoint(TPoint &p)    
  15. {    
  16.     X=p.X;    
  17.     Y=p.Y;    
  18.     cout<<"Copy-initialization Constructor is called\n";    
  19.     cout<<"Constructor is called\n";    
  20. }    
  21. int main()    
  22. {    
  23.     TPoint P4,P5(2);    
  24.     TPoint p1(4,9);    
  25.     TPoint p2(p1);    
  26.     TPoint p3=p2;    
  27.     cout<<"p3=("<<p3.getx()<<","<<p3.gety()<<")\n";    
  28.     return 0;    
  29. }    

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

现象:

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

如何解决:将带两个参数的构造函数改为缺省的构造函数,就是可以将TPoint(int x,int y)改为TPoint(int x=0,int y=0) ; 在运行过程中,TPoint p1(4,9)和TPoint p4,p5(2);调用了构造函数,而TPoint p2(p1)和TPoint p3=p2是使用了拷贝构造函数。如下所示:

  1. //sy3_2.cpp    
  2. #include<iostream>    
  3. using namespace std;    
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!