第三章实验

实验目的和要求:

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:

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

错误的运行结果如下图:

改正后的程序如下:

将”cout<<a2.a<<endl;//ERROR”改为“a2.print();”

正确运行结果:

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)写出程序的输出结果。

加入语句为:

输出结果为:

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

运行结果如下:

结果解释首先使用指针指向新创建的对象,再利用构造函数输出结果,最后调用析构函数实现再次输出。

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(15.0,10.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(4.0,8.0);  
  cout<<"修改后的矩形的尺寸:";  
   p2.printf();  
   return 0;  
}  
运行结果:

分析与讨论

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

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

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

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

    3、何时进行对象初始化?如何进行?

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

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

实验总结

通过对本次实验的操作,我熟悉了类中成员的访问权限,还对定义的格式有了更深一步的了解。除此之外,在实验过程中通过对析构函数的调用,对析构函数的调用有了进一步的了解,也对它的用法有了初步的认识。掌握了对象的定义及其初始化的方法,对有参和无参的构造函数有了更深的了解。通过实验也能更好的敲代码。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值