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

原创 2018年04月15日 21:20:06

一、实验目的和要求:

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

}  

运行结果:

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

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进行分配空间,再调用构造函数进行初始化。

四、实验总结

       通过对本次实验的操作,我主要熟悉了类中成员的访问权限,也对定义的格式有了更深一步的了解。除此之外,在实验过程中通过对析构函数的调用,对析构函数的调用有了进一步的了解,也对它的用法有了初步的认识。掌握了对象的定义及其初始化的方法,对有参和无参的构造函数有了更深的了解。虽然过程中也会遇到对调试过程中出现的问题难以解决诸如此类的问题,但还好通过与同学讨论、查询相关书籍或网上搜索等多种方法一一解决掉。希望在以后的学习中尽量细心,加深自己对C++这门编程语言的了解。

     



用C++Builder 编写定时关机程序

用C++Builder 编写定时关机程序 辽宁大学 郑永凡 从Internet下载较大的软件时,由于目前网络带宽的原因,许多人喜欢在晚间进行,而到深夜时就存在人需要休息的问题。目前绝大多数下载软件可以...
  • stanely
  • stanely
  • 2001-06-07 15:29:00
  • 1470

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

实验3,构造函数与析构函数一、实验目的和要求1、熟悉类的定义格式和类中成员的访问权限。2、构造函数与析构函数的调用时机与顺序。3、掌握对象的定义以及对象的初始化的时机与方法。二、实验内容1、下面程序s...
  • qq_41797651
  • qq_41797651
  • 2018-04-14 23:32:01
  • 15

C++实验报告(构造函数与析构函数的编程)

  • 2017年11月11日 19:26
  • 119KB
  • 下载

实验_构造函数与析构函数.doc

  • 2009年05月02日 21:21
  • 36KB
  • 下载

实验三构造与析构函数

实验三  构造函数和析构函数 班级:         学号:            姓名:          成绩:     一. 实验目的 1.理解构造函数和析构函数作用; 2.掌握各种类型...
  • benben0729
  • benben0729
  • 2015-05-10 08:52:35
  • 231

c++继承里面的构造函数和析构函数

// ConsoleApplication9.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include class B...
  • zhouguangfei0717
  • zhouguangfei0717
  • 2017-10-24 19:55:28
  • 75

C++构造函数和析构函数的总结

C++是面向对象的编程语言,在定义类的时候,离不开构造和析构函数。类中同类同名的成员函数称为构造函数,主函数中初始化一个对象时,如果有传入数据,其实是传入到构造函数的形参中。...
  • ladybai
  • ladybai
  • 2016-03-10 14:51:41
  • 4455

C++:类的构造函数和析构函数

C++:类的构造函数和析构函数标签(空格分隔): c++ 作者:陈小默C类的构造函数和析构函数 构造函数 声明和定义 引用参数与构造函数 使用构造函数定义对象 默认构造函数 析构函数 声明和定义 析...
  • qq_32583189
  • qq_32583189
  • 2016-09-02 17:05:56
  • 7008

C++类 实例 数据成员 成员函数 构造函数 析构函数

class student {        //不写权限默认为私有的 private        int   id;        char name[16];        int ...
  • qq_28710983
  • qq_28710983
  • 2017-12-05 22:18:38
  • 56

C++中构造函数,拷贝构造函数,析构函数

C++中默认构造函数就是没有形参的构造函数。准确的说法,按照《C++ Primer》中定义:只要定义一个对象时没有提供初始化式,就是用默认构造函数。为所有 的形参提供默认实参的构造函数也定义了默认构造...
  • u012501459
  • u012501459
  • 2015-03-09 21:29:30
  • 1569
收藏助手
不良信息举报
您举报文章:实验三 构造函数与析构函数
举报原因:
原因补充:

(最多只允许输入30个字)