显式析构..........

昨天有人问我能不能显示调用析构函数。
我的回答是可以。但为什么显法调用析构函数跟没有调用结果一样的呢(未用new申请内存空间)。
至于为什么,我今天在这里说下。

用构造函数创建对像后,程程序负责跟踪对象直到过期为止。 对象过期时,程序将会自动调用一个析构函数。

构析函数完成清理工作。

例如 如构造函数用new分配内存,则析构涵数将使用delete来释放这些内存。

下面是这篇帖子子的重点。


什么时候应调用析构函数呢?这个由编译器决定,通常不应在代码中显示调用析构函数(布局new除外),如果创建的是静态存储类对象。则其析构涵数将在程序结束时自动调用。如果创建的是自动存储类对象,则其析构函数将在程序执行完代码块时自动调用。

如果对象是通过new创建的,则它将驻留在堆内存或自由存储区中,当使用delete来释放内存时,其析构函数将自动调用。
最后,程 序可以创建临时对象来完成特定的操作,在这种情况下,程序将在结束对该对象的使用时自动调用其析构函数。

由于在类对象过期时析构函数将自动被调用,因此必须有一个析构函数。如果程序员没有提供析构函数,编译器将隐式的声名一个默认析构函数,并在发现对象被删除的代码后,提供默认析构函数的定义。
上面我只是简要的说了下析构函数。

#include<iostream>
using namespace std;
class wyz
{
private:
         int x;
public: 
     wyz(int g)
 { 
          x=g;
    
        cout<<"调用构造函数/n";
 }
    ~wyz()
 {
  
       cout<<"调用析构函数/n";
 }
    void fun()
 {
        cout<<x<<endl;
 } 
};

int main()
{
       wyz gg(10);
       gg.~wyz();
       gg.fun();
    

      return 0;
}

下面就说说为什么显示调用函数(未使用new申请内存)和没有调用结果一样。
首先析构函数和其它成员函数没有多大区另,区别就是函数名特殊(名前加上了~),其次他会被编译器自动调用。
除了这两点之外他和别的成员函数没什么区别(构造函数与此不同,这里就不说了)。
一个对象什么时候过期由他的作用域决定。对像过期了他里面存储的数据也就不存在了。
 

当对象的引用或指针超出作用域时,不会运行析构函数。只有删除指向动态分配对象的指针或实际

对象(而不是对象的引用)超出作用域时,才会运行析构函数。
 

在上面的代码中gg这个对象的作用域中是从main()的左大括号到右大括号。
只要在这个作用内对象gg就存在。
你虽然调用了wyz类的析构函数,但gg没有超出他的作用域故它是存在的。

说白了很简单,一句话析构函数的作用是完成清理。要清理什么还是要程序员指定的。编译器只不过帮助我们管理这个,让程序员创建一个对象后就不会管理它的销毁时间。
上面的这个析构函数里面什么也没有定义。它什么也不做。(相当于一个空函数)。你在这里调用他就跟你调用一个空函数的结果一样。
要不问什么上面的程序中会调用两次析构函数。第一次不用说是你自己调用的,第二次是编译器调用的。对象并不是你调用了析构函数它就不调用了,只有在对象过期它才会销毁。

很多人对析构函数的认识是这样的。他们认为只要调用了析构函数对象就不存在了。这种认为是错误的。对象或变量的销毁是由他所在的作用域决定的。(静太的除外)没有超出这个作用域它就存在,超出这个作用域就销毁它。
到此相信大家都明白了吧。

至于用采用时new时的效果今天在这里就不说了。
 

最后声名下,上面的都是我自己查找资料和自己的认为。有什么不对的地方望老师们能给指正出来。谢谢

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值