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

作者: Laura McKinney
创建日期: 1 四月 2021
更新日期: 14 可能 2024
Anonim
11构造函数与析构函数(一)
视频: 11构造函数与析构函数(一)

内容


构造函数和析构函数是与它们的类同名的成员函数。前者类型 建设者 帮助初始化对象。相反, 析构函数 与构造函数不同,后者在无用的情况下删除创建的构造函数。

有时需要先初始化对象的某些部分,然后才能使用它。例如,我们在堆栈上进行操作,在执行任何操作之前,必须始终将堆栈的顶部设置为零。自动初始化的此功能是通过“构造函数”执行的。就像,如果一个对象需要在销毁它之前执行一些代码。例如,如果对象需要在销毁文件之前关闭它已打开的文件。可以在“析构函数”的帮助下执行。

让我们借助比较表来概述构造函数和析构函数之间的一些基本差异

  1. 比较表
  2. 定义
  3. 关键差异
  4. 结论

比较图:

比较依据建设者析构函数
目的

它将内存分配给对象。它取消分配对象的内存。
宣言 class_name(参数,如果有的话){};〜class_name(无参数){};
争论 构造函数接受参数 析构函数不接受任何参数。
呼唤创建对象时,将自动调用构造函数。当块退出或程序终止时,将自动调用析构函数。
工作中构造函数允许对象在使用之前初始化其某些值。析构函数允许对象在销毁对象时执行某些代码。
执行顺序

构造函数以连续顺序被调用。
析构函数以与构造函数相反的顺序调用。
数量上 一个类中可以有多个构造函数。类中始终只有一个析构函数。
复制构造函数 复制构造函数允许构造函数从另一个对象声明和初始化一个对象。没有这样的概念。
超载 构造函数可以重载。析构函数不能重载。


构造函数的定义:

一种 建设者 基本上是class的成员函数,它将初始化对象并为其分配内存。构造函数可以很容易地识别出来,因为它们以与类相同的名称进行声明和定义。构造函数没有任何返回类型。因此,他们不会返回任何东西,甚至不会返回“ void”。构造函数始终在类的公共部分中定义。

一个类中可以有多个构造函数。可以根据传递的参数的数量和类型来区分它们。如果一个类中有多个构造函数;隐式构造函数(什么也不做的构造函数)必须与它们一起定义;它什么也不做,只是满足了编译器。

构造函数也可以使用默认参数定义。而它们也“动态”初始化对象。构造函数既不能继承,也不能是虚拟的,但可以重载。无法将他们引荐到他们的地址。

构造函数的类型

基本上有三种类型的构造函数-默认,参数化和复制构造函数。

  • 默认构造函数:这是一个构造函数,其中没有给构造函数任何参数。默认构造函数没有参数,但是默认构造函数的值可以默认(动态)传递。
  • 参数化构造函数:这种类型的构造函数带有参数;我们可以将不同的值作为参数传递给数据成员。
  • 复制构造函数:复制构造函数与其他类型的构造函数不同,因为它接受另一个对象的地址作为参数。

构造函数的实现:

类Const {int a,b; public:Const()//没有参数的构造函数{a = 0; b = 0; } Const(int c,int d){//参数为a = c的构造函数; c = d; }; int main(){const C1; C2(10,20); //此语句调用构造函数}

创建C1时,将执行不带参数的构造函数,因为C1不传递任何参数。而创建C2时,将执行带有参数的构造函数,因为它将两个整数传递给构造函数。

析构函数的定义:

一种 析构函数 也是类的成员函数,该类会取消分配给对象的内存。它的定义与类的名称相同,后跟一个 波浪号(〜) 符号。析构函数始终以与构造函数相反的顺序调用。


类中始终有一个析构函数,因为它不接受任何参数。一旦执行控制离开了该块,本地对象将被销毁。另一方面,当整个程序终止时,全局对象将被破坏。析构函数由编译器隐式调用。如果这些类是继承的,并且一个类是从父类派生的,则子类和父类都具有析构函数;然后,首先调用派生类的析构函数,然后调用父类的析构函数。

析构函数的实现:

类Const {int a,b; public:Const(int c,int d)//带有参数的构造函数。 {a = c; c = d; cout <<“ a和b的值是” <<>

创建C1对象时,将调用带有两个整数类型参数的构造函数,并初始化成员“ a,b”,并编辑“ a,b”的值。在该析构函数被调用之后,“对象C1被销毁”。

需要破坏者

构造函数的创建会消耗一些内存空间,因为它最终会将内存分配给对象。必须在销毁对象之前释放此分配的内存,以释放资源用于其他任务。销毁器对于预期的目的非常有用,它可以有效地销毁对象并执行清理任务以释放内存。

  1. 构造函数的主要目的是在对象创建时为其分配内存。与之相反,析构函数的主要目的是在销毁对象时释放其内存。
  2. 允许构造函数接受参数,因为参数可用于初始化类的数据成员。另一方面,析构函数不接受任何参数,因为其唯一的工作就是释放对象的内存。
  3. 创建对象时将调用构造函数。相反,当程序终止或程序退出在其中创建对象的块时,将调用析构函数。
  4. 构造函数通常用于初始化类的数据成员,而析构函数用于让对象在销毁对象之前执行某些操作。
  5. 构造函数以连续的顺序执行,这意味着如果存在一个继承基类的派生类,并且创建了该派生类的对象,则它将先调用基类的构造函数,然后再调用派生类的构造函数。相反,首先调用派生类的析构函数,然后调用基类,这意味着析构函数以与构造函数相反的顺序执行。
  6. 在类中,可以有多个构造函数,这些构造函数由传递的数字参数标识,而只能有一个析构函数。
  7. 复制构造函数有一个概念,它允许一个对象从另一个对象初始化,而析构函数没有这样的概念。
  8. 构造函数可以重载以在同一构造函数的名称下执行不同的操作。相反,析构函数不能重载。

结论:

除了相似之处之外,构造函数和析构函数是类的特殊成员函数并具有相同的名称,它们之间的本质区别是,在分配内存时调用“构造函数”,而在内存分配时调用“析构函数”对象内存释放的时间。即使未在类中定义构造器和析构函数,编译器也会隐式调用它们。