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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值