构造函数在创建对象时,为对象的数据成员分配内存地址空间或申请其他资源,这些资源在对象销毁时应该被释放。例如,在构造函数中,为对象申请了堆内存空间,当对象被销毁时,如果不释放堆内存,则堆内存将一直存在,这将造成内存错误,系统需要提供一种机制来释放对象存在期间申请的资源,保证对象销毁后,释放所有的资源,那么该怎么解决呢?
析构函数是一个特殊的成员函数,每当程序中的对象超出其作用域,需要销毁对象时,系统都将自动调用相应的析构函数,完成对内存空间的释放,以及一些扫尾工作。析构函数的操作是构造函数相反操作,相当于是构造函数的“逆”,析构函数的函数名为“~类名”。
析构函数有如下特点。
(1)析构函数是类的成员函数。
(2)析构函数名为“~类名”,析构函数没有参数。
(3)析构函数没有返回类型,但函数体内可以有return语言控制程序结构。
(4)析构函数没有重载函数,一个类只用一个析构函数。
(5)析构函数是系统自动调用的,在对象撤销时自动调用,不能显式调用。
(6)在没有用户自定义的析构函数时,系统会添加默认的析构函数,默认的析构函数只回收对象的数据成员内存空间,不能释放对象申请的其他资源。
(7)析构函数的访问控制符为“public”。
析构函数是主要用来释放对象在生存期内所占用资源,如数据成员所占内存空间、堆空间、打开的文件等。(www.daowen.com)
【例2.17】设计名字类,名字可以分为名和姓两个部分,名和姓的长度不确定,使用动态内存分配方式实现。
在例2.17中,构造函数中为两个指针数据成员分配了内存空间,在析构函数中,释放了指针所指向的内存空间。在此例中,需要注意申请内存空间时,空间大小应该是字符串长度加1,因为还有字符结束标志“\0”的空间需要申请。
当程序中出现多个对象时,需要析构对象时,析构的执行顺序正好与构造顺序相反,即后构造对象的先析构,而先构造对象的后析构。因为如果先构造的对象也先析构,那么后构造的对象有可能根据先前的对象而构造出来,那么在析构了前面的对象后,会造成后面对象的引用错误。把例2.17中的main函数改造成如下代码。
此例中,看出析构函数的调用顺序是先构造的后析构,后构造的先析构。
析构复合对象时,析构函数的执行顺序与构造函数也正好相反。
【例2.18】定义课程类,课程有名称和学分属性,名称属性是名称类类型,学分是浮点数类型,创建课程对象,课程名称是“面向对象程序设计”,学分为1.5。
复合对象的析构顺序是系统先析构当前对象,然后销毁成员对象。
提示
在程序设计,一般情况下用添加析构函,用系统默认析构函数就可把数据成员的间进行释放。在对象中使用堆空间或打开文件这样的资时,就需要添自定义的析构数,把资源进释放。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。