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

一、实验目的和要求

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

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

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

二、实验内容

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

原程序:

//sy3_1.cpp
#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;//ERROR
};
int main()
{
Aa a1(1),a2(2);
a1.print();
cout<<a2.a<<endl;
return 0;
}

运行结果:


改正:

//sy3_1.cpp
#include<iostream>
using namespace std;
class Aa
{
public:
int a;
Aa(int i=0){a=i;cout<<"Constructor"<<a<<endl;}
~Aa(){cout<<"Destructor"<<a<<endl;}
void print(){cout<<a<<endl;}
private:
};
int main()
{
Aa a1(1),a2(2);
a1.print();
cout<<a2.a<<endl;
return 0;

}

运行结果:


2、调试下列程序。

//sy3_2.cpp
#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";
}
int main()
{
TPoint p1(4,9);
TPoint p2(p1);
TPoint p3=p2;
cout<<"p3=("<<p3.getx()<<","<<p3.gety()<<")\n";
return 0;

}

运行结果:


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

cout<<"Constructor is called\n";

(1)

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

程序如下:

//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<<"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);

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

出现的现象:


调试结果:


分析如下:如果要解决这个问题就要将带两个参数的构造函数改为缺省的构造函数,就是可以将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是使用了拷贝构造函数。

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;

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

程序如下:

//sy3_3.cpp  
#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来指向新创建的对象,并调用了一个和不带构造参数的构造函数对对象进 行初始化,因此就输出了前面三个语句;实验结束后又调用了析构函数,之后就产生了后面三句的输出结果。

4、请定义一个矩形类(Rectangle),私有数据成员为矩形长度(len)和宽度(wid),无参构造函数置len和wid为0,有参构造函数置len和wid为对应形参的值,另外还包括求矩形的周长、求矩形的面积、取矩形的长度和宽度、修改矩形的长度和宽度为对应形参的值、输出矩形尺寸等公有成员函数。要求输出矩形尺寸的格式为“length:长度,width:宽度”。(sy3_4.cpp)

实验程序如下:

//sy3_4.cpp  
#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;}  
   printf()  
   {  
       cout<<"length:"<<len<<endl;  
       cout<<"width:"<<wid<<endl;  
       }  
private:  
    int len,wid;  
};  
int main()  
{  
  Rectangle p1;  
  Rectangle p2(6.0,8.0);  
  cout<<"p1的矩形尺寸:\n";  
  p1.printf();  
  cout<<"p2的矩形尺寸:\n";  
  p2.printf();  
  cout<<"p2的周长:"<<p2.Circumference()<<endl;  
  cout<<"p2的面积:"<<p2.Area()<<endl;  
  cout<<"p2的长度:"<<p2.getl()<<endl;  
  cout<<"p2的宽度:"<<p2.getw()<<endl;  
  p2.charge(5.0,6.0);  
  cout<<"修改后的矩形的尺寸:";  
   p2.printf();  
   return 0;  
}  

运行结果如下:


分析与讨论

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

只有类中的函数才能访问类中私有成员。

2、构造函数和析构函数的调用顺序;

在对象创建时,先用构造函数对其进行初始化,在程序结束后用析构函数释放由构造函数分配的内存,而且析构函数的执行顺序与构造函数的执行顺序刚好相反。

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

一般对象:在对象的创建时对其进行初始化,可以用构造函数或者用拷贝构造函数进行初始化。

堆对象:用new进行分配空间,再调用构造函数进行初始化。

实验总结

通过本次的实验,我对于类的定义格式和类中成员的访问权限、构造函数与析构函数的调用与顺序和对象的定义以及对象的初始化的时机与方法进行了一些初步的了解和掌握;也学习到了一些新的知识和方法,并且学习到了构造函数和析构函数的调用顺序以及对象初始化如何进行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值