久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2169|回復(fù): 0
收起左側(cè)

c++中顯示析構(gòu)問題

[復(fù)制鏈接]
ID:102668 發(fā)表于 2016-1-10 23:12 | 顯示全部樓層 |閱讀模式
昨天有人問我能不能顯示調(diào)用析構(gòu)函數(shù)。
我的回答是可以。但為什么顯法調(diào)用析構(gòu)函數(shù)跟沒有調(diào)用結(jié)果一樣的呢(未用new申請(qǐng)內(nèi)存空間)。
至于為什么,我今天在這里說下。

用構(gòu)造函數(shù)創(chuàng)建對(duì)像后,程程序負(fù)責(zé)跟蹤對(duì)象直到過期為止。 對(duì)象過期時(shí),程序?qū)?huì)自動(dòng)調(diào)用一個(gè)析構(gòu)函數(shù)。

構(gòu)析函數(shù)完成清理工作。

例如 如構(gòu)造函數(shù)用new分配內(nèi)存,則析構(gòu)涵數(shù)將使用delete來釋放這些內(nèi)存。

下面是這篇帖子子的重點(diǎn)。


什么時(shí)候應(yīng)調(diào)用析構(gòu)函數(shù)呢?這個(gè)由編譯器決定,通常不應(yīng)在代碼中顯示調(diào)用析構(gòu)函數(shù)(布局new除外),如果創(chuàng)建的是靜態(tài)存儲(chǔ)類對(duì)象。則其析構(gòu)涵數(shù)將在程序結(jié)束時(shí)自動(dòng)調(diào)用。如果創(chuàng)建的是自動(dòng)存儲(chǔ)類對(duì)象,則其析構(gòu)函數(shù)將在程序執(zhí)行完代碼塊時(shí)自動(dòng)調(diào)用。

如果對(duì)象是通過new創(chuàng)建的,則它將駐留在堆內(nèi)存或自由存儲(chǔ)區(qū)中,當(dāng)使用delete來釋放內(nèi)存時(shí),其析構(gòu)函數(shù)將自動(dòng)調(diào)用。
最后,程 序可以創(chuàng)建臨時(shí)對(duì)象來完成特定的操作,在這種情況下,程序?qū)⒃诮Y(jié)束對(duì)該對(duì)象的使用時(shí)自動(dòng)調(diào)用其析構(gòu)函數(shù)。

由于在類對(duì)象過期時(shí)析構(gòu)函數(shù)將自動(dòng)被調(diào)用,因此必須有一個(gè)析構(gòu)函數(shù)。如果程序員沒有提供析構(gòu)函數(shù),編譯器將隱式的聲名一個(gè)默認(rèn)析構(gòu)函數(shù),并在發(fā)現(xiàn)對(duì)象被刪除的代碼后,提供默認(rèn)析構(gòu)函數(shù)的定義。
上面我只是簡要的說了下析構(gòu)函數(shù)。

#include<iostream>
using namespace std;
class wyz
{
private:
         int x;
public:  
     wyz(int g)
{  
          x=g;
     
        cout<<"調(diào)用構(gòu)造函數(shù)\n";
}
    ~wyz()
{
   
       cout<<"調(diào)用析構(gòu)函數(shù)\n";
}
    void fun()
{
        cout<<x<<endl;
}  
};

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

      return 0;
}

下面就說說為什么顯示調(diào)用函數(shù)(未使用new申請(qǐng)內(nèi)存)和沒有調(diào)用結(jié)果一樣。
首先析構(gòu)函數(shù)和其它成員函數(shù)沒有多大區(qū)另,區(qū)別就是函數(shù)名特殊(名前加上了~),其次他會(huì)被編譯器自動(dòng)調(diào)用。
除了這兩點(diǎn)之外他和別的成員函數(shù)沒什么區(qū)別(構(gòu)造函數(shù)與此不同,這里就不說了)。
一個(gè)對(duì)象什么時(shí)候過期由他的作用域決定。對(duì)像過期了他里面存儲(chǔ)的數(shù)據(jù)也就不存在了。

當(dāng)對(duì)象的引用或指針超出作用域時(shí),不會(huì)運(yùn)行析構(gòu)函數(shù)。只有刪除指向動(dòng)態(tài)分配對(duì)象的指針或?qū)嶋H
對(duì)象(而不是對(duì)象的引用)超出作用域時(shí),才會(huì)運(yùn)行析構(gòu)函數(shù)。

在上面的代碼中g(shù)g這個(gè)對(duì)象的作用域中是從main()的左大括號(hào)到右大括號(hào)。
只要在這個(gè)作用內(nèi)對(duì)象gg就存在。
你雖然調(diào)用了wyz類的析構(gòu)函數(shù),但gg沒有超出他的作用域故它是存在的。

說白了很簡單,一句話析構(gòu)函數(shù)的作用是完成清理。要清理什么還是要程序員指定的。編譯器只不過幫助我們管理這個(gè),讓程序員創(chuàng)建一個(gè)對(duì)象后就不會(huì)管理它的銷毀時(shí)間。
上面的這個(gè)析構(gòu)函數(shù)里面什么也沒有定義。它什么也不做。(相當(dāng)于一個(gè)空函數(shù))。你在這里調(diào)用他就跟你調(diào)用一個(gè)空函數(shù)的結(jié)果一樣。
要不問什么上面的程序中會(huì)調(diào)用兩次析構(gòu)函數(shù)。第一次不用說是你自己調(diào)用的,第二次是編譯器調(diào)用的。對(duì)象并不是你調(diào)用了析構(gòu)函數(shù)它就不調(diào)用了,只有在對(duì)象過期它才會(huì)銷毀。

很多人對(duì)析構(gòu)函數(shù)的認(rèn)識(shí)是這樣的。他們認(rèn)為只要調(diào)用了析構(gòu)函數(shù)對(duì)象就不存在了。這種認(rèn)為是錯(cuò)誤的。對(duì)象或變量的銷毀是由他所在的作用域決定的。(靜太的除外)沒有超出這個(gè)作用域它就存在,超出這個(gè)作用域就銷毀它。
到此相信大家都明白了吧。

至于用采用時(shí)new時(shí)的效果今天在這里就不說了。

最后聲名下,上面的都是我自己查找資料和自己的認(rèn)為。有什么不對(duì)的地方望老師們能給指正出來。謝謝

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产免费又黄又爽又刺激蜜月al | 中文字幕av一区 | 成人黄色在线视频 | av黄色片在线观看 | 国产99热在线 | 国产日韩欧美一区二区 | 亚洲福利| 国产精品久久免费观看 | 91久久精品一区二区二区 | 国产精品一区二区av | 国产精品黄色 | 亚洲高清一区二区三区 | 黄色在线免费看 | 污视频免费在线观看 | 国产精品福利在线 | 在线观看www高清视频 | 91高清免费观看 | 99久久免费精品视频 | 国产精品久久久久婷婷二区次 | 国产亚洲成av人在线观看导航 | 日韩综合 | 青青操av| 四季久久免费一区二区三区四区 | 免费h在线| 97精品超碰一区二区三区 | 国产乱码一区 | 91在线视频观看 | 日本精品视频一区二区三区四区 | 日韩电影一区 | 日韩有码一区 | 欧美 日韩 视频 | 日韩精品一区二 | 在线观看av网站永久 | 久久看片| 国产精品久久久久久久久免费桃花 | 国产精品久久影院 | 日韩精品久久一区二区三区 | 国产精品国产三级国产aⅴ浪潮 | 国产一区二区三区精品久久久 | 午夜丰满少妇一级毛片 | 99这里只有精品 |