析构函数与构造函数的区别联系

来源:互联网 发布:js dom遍历 编辑:程序博客网 时间:2024/04/30 14:46

     在备战C++的学习当中,由于很多都用到函数,再次要求自己加深对函数的理解,C++中知识是并不多,我们只有不断的理解函数的真正用法,下面学习才会顺水推舟!加油!

   析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

 

C++语言析构函数格式

C++当中的析构函数格式如下:  class <类名>  {  public:  ~<类名>();  };  <类名>::~<类名>()  {  //函数体  }  如以下定义是合法的:  class T  {  public:  ~T()  };  T::~T()  {  //函数体  }
  当程序中没有析构函数时,系统会自动生成以下析构函数:
  <类名>::~<类名>(){},即不执行任何操作。

  下面通过一个例子来说明一下析构函数的作用:

#include<iostream>  using namespace std;  class T  {  public:  ~T(){cout<<"析构函数被调用。";} //为了简洁,函数体可以直接写在定义的后面。  };  int main()  {  T *t=new T;//建立一个T类的指针对象t  delete t;  cin.get();  }  最后输出:


构造函数 是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数 可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载

 C++的构造函数定义格式为:

class <类名>  {  public:  <类名>(参数表)  //...(还可以声明其它成员函数)  };  <类名>::<函数名>(参数表)  {  //函数体  }  如以下定义是合法的:  class T  {  public:  T(int a=0){i=a;}//构造函数允许直接写在类定义内,也允许有参数表。  private:int i;  };


如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数:

  1、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;

  2、如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);

  3、在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或 编译器提供的默认构造函数)。

  <类名>::<类名>(){},即不执行任何操作。

 

C++构造函数例子

  //注意若将本代码直接复制进编译器,可能会报错,原因是网页生成时会在代码前加一个中文占位符

  //最好将代码再写一次

#include <iostream>  using namespace std;  class time  {  public:  time() //constructor.构造函数  {  hour=0;  minute=0;  sec=0;  }  void set_time();  void show_time();  private:  int hour;  int minute;  int sec;  };  int main()  {  class time t1;  t1.show_time();  t1.set_time();  t1.show_time();  return 0;  }  void time::set_time()  {  cin >>hour;  cin >>minute;  cin >>sec;  }  void time::show_time()  { cout<<hour<<":"<<minute<<":"<<sec<<endl;  }  程序运行情况:  0:0:0  10 11 11 回车  10:11:11


     任何时候,只要创建类或结构,就会调用它的构造函数。类或结构可能有多个接受不同参数的构造函数。构造函数使得程序员可设置默认值、限制实例化以及编写灵活且便于阅读的代码。

 构造函数与析构函数的区别

构造函数有以下特点:
1.构造函数的名字必须与类名相同;
2.构造函数可以有任意类型的参数,但不能具有返回类型;
3.定义对象时,编译系统会自动地调用构造函数;
4.构造函数是特殊的成员函数,函数体可以在类体内,也可写在类体外;
5.构造函数被声明为公有函数,但它不能像其他成员函数那样被显式调用,它是在定义对象的同时被调用的。

析构函数有以下特点:
1.析构函数的名字必须与类名相同,但它前面必须加一个波浪号  ~  ;
2.析构函数没有参数,也没有返回值,而且不能被重载,因此在一个类中只能有一个析构函数;
3.当撤销对象时,编译系统会自动地调用析构函数。