读书人

析构函数与构造函数的差异联系

发布时间: 2012-09-06 10:37:01 作者: rapoo

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

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

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

析构函数与构造函数的差异联系

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

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

  //最好将代码再写一次

#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.当撤销对象时,编译系统会自动地调用析构函数。

6楼abc609315767昨天 20:03
总结的很好
5楼Wentasy昨天 19:29
总结得很全面。
4楼jiuqiyuliang昨天 18:24
联系与区别很到位
3楼liutengteng130昨天 16:34
不错,顶了。。
2楼beijiguangyong昨天 16:08
vb当中有构造函数和析构函数么?
1楼gwblue昨天 15:24
值得学习!

读书人网 >其他相关

热点推荐