构造函数和析构函数的作用是什么?构造函数和析构函数特点
- 数据库
- 2023-08-13
- 90
其实构造函数和析构函数的作用是什么的问题并不复杂,但是又很多的朋友都不太了解构造函数和析构函数特点,因此呢,今天小编就来为大家分享构造函数和析构函数的作用是什么的一些知...
其实构造函数和析构函数的作用是什么的问题并不复杂,但是又很多的朋友都不太了解构造函数和析构函数特点,因此呢,今天小编就来为大家分享构造函数和析构函数的作用是什么的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
C++中有些类的析构函数也被定义为虚函数,这样做有什么用
在阅读C++项目(caffe)源码时,发现不少基类不仅把常规的成员函数定义成虚函数(virtual),也会把析构函数定义为虚函数,稍稍思考下,这样做的确是有原因的,本文将结合C++代码实例尝试探讨下。
常规随便写一段C++代码作为实例,在这个例子中,我们先不把析构函数定义为虚函数:
这段代码的逻辑很简单,无非就是定义了两个类:类Base的成员函数foo()为虚函数,构造函数和析构函数都是常规函数,此外它还有个public的成员变量buf。类Child则公开继承了Base,因此它可以直接使用Base::buf——在构造函数中new了一段内存,并且在析构函数delete掉它。
Childc;
c.foo();
我们直接使用Child实例化一个对象c,调用c.foo(),此时得到如下输出:
一切尽在预料中。
不安全的问题虽说对象c调用foo()的输出完全符合预计,但像上面那样定义类仍然是非常危险的做法。在这一节我们曾讨论过,父类指针可以调用派生类的重写函数,因此下面这两行C++代码也是合法的,请看:
编译这段C++代码完全没有问题,运行也不会报错,输出如下:
Baseconstruct
Childconstruct
Child::foo
Basedeconstruct
可是,从输出信息能够看出,派生类Child的析构函数没有被调用,对于本例而言,new出来的buf没有对应的delete,势必会造成内存泄漏。
解决问题要解决所谓的“不安全问题”,其实很简单,按照题目说的做——将基类的析构函数也定义为虚函数就可以了,请看修改后的C++代码:
也即尽在基类Base的析构函数前加上virtual关键字,其他的所有代码都无需改动。现在再执行下面的这几行C++代码:
输出如下:
显然,此时派生类Child的析构函数也会被调用了,内存泄漏的问题倍解决了。
小结C++中的virtual关键字是非常好用,也是C++程序员必须掌握的关键字,其实,“不安全问题”出现的原因也是简单的:我们在静态类型与动态绑定一节中提到过,基本上只有涉及到virtual函数时,才会发生动态绑定,此时通过对象指针(pb)调用的函数由它指向的类(Child)决定,所以此时派生类Child的析构函数会被调用。如果基类Base的析构函数不是虚函数,那么对象指针(pb)调用的函数由其静态类型(Base)决定,也即调用的其实只是基类Base的析构函数而已。
析构函数的作用有哪些
如果构造函数打开了一个文件,最后不需要使用时文件就要被关闭。析构函数允许类自动完成类似清理工作,不必调用其他成员函数。
析构函数也是特殊的类成员函数。简单来说,析构函数与构造函数的作用正好相反,它用来完成对象被删除前的一些清理工作,也就是专门的扫尾工作。
构造函数和析构函数能不能被继承
析构函数当然是默认完全继承。而构造函数可能有多种,所以在不显示继承调用父类构造函数的情况下,子类只能继承父类的默认构造函数,就是没有任何参数的构造函数。
析构函数与构造函数的区别
析构函数和构造函数是C++中的两个重要概念,它们的区别如下:析构函数和构造函数功能不同,前者用于释放对象在使用过程中申请的资源,后者用于初始化对象。构造函数是在对象生成时自动调用的函数,主要用于给成员变量初始化,其语法格式与类名相同;而析构函数是在对象被销毁(包括正常结束和异常结束)时自动调用的函数,
用于释放对象在使用过程中申请的资源,其语法格式为“~类名”。在C++编程中,当我们定义一个类时,一般都会同时定义它的构造函数和析构函数,并在其中进行适当的赋值和删除操作,以确保程序的正确性和效率。同时需要注意的是,析构函数中的删除操作必须与构造函数中的初始化操作相对应,否则可能产生内存泄漏等问题。
c语言里面有构造函数吗
c语言里面有构造函数,C++和JAVA中有构造/析构函数,C语言中也有实现的方法,在gcc下可以使用关键字__attribute__指定构造函数或者析构函数。
他们由编译器在编译阶段进行处理。即类的对象被创建的时候,编译系统对该对象分配内存空间,并自动调用构造函数,完成类成员的初始化。
析构函数怎么定义
析构函数(destructor)与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后”的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。
文章分享结束,构造函数和析构函数的作用是什么和构造函数和析构函数特点的答案你都知道了吗?欢迎再次光临本站哦!
本文链接:http://xinin56.com/su/7469.html