c 中析構函式可以實現什麼,c 中的虛擬析構函式有什麼作用?

2022-03-08 21:27:35 字數 4816 閱讀 8458

1樓:

析構函式名與類名相同,只是在函式名前面加乙個位取反符~,例如~stud( ),以區別於建構函式。它不能帶任何引數,也沒有返回值(包括void型別)。只能有乙個析構函式,不能過載。

如果使用者沒有編寫析構函式,編譯系統會自動生成乙個預設的析構函式(即使自定義了析構函式,編譯器也總是會為我們合成乙個析構函式,並且如果自定義了析構函式,編譯器在執行時會先呼叫自定義的析構函式再呼叫合成的析構函式),它也不進行任何操作。所以許多簡單的類中沒有用顯式的析構函式。

2樓:匿名使用者

析構函式名也應與類名相同,只是在函式名前面加乙個波浪符~,例如~stud( ),以區別於建構函式。它不能帶任何引數,也沒有返回值(包括void型別)。只能有乙個析構函式,不能過載。

如果使用者沒有編寫析構函式,編譯系統會自動生成乙個預設的析構函式,它也不進行任何操作。所以許多簡單的類中沒有用顯式的析構函式。c++當中的析構函式格式如下:

  class 《類名》   ;   《類名》::~《類名》()      如以下定義是合法的:   class t   ;   t::

~t()      當程式中沒有析構函式時,系統會自動生成一下析構函式:   《類名》::~《類名》(){},即不執行任何操作。

  下面通過乙個例子來說明一下析構函式的作用:   #includeusing namespace std;   class t    //為了簡潔,函式體可以直接寫在定義的後面。   };   int main()      最後輸出:

  析構函式被呼叫。 參考資料: http:

c++中的虛擬析構函式有什麼作用?

3樓:平填真杯具平男

class father;

class son : public class father;

在上述條件下,可以實現多型

father* pointer = new son;

當釋放時

delete pointer;

在這個時

候,如果,father類和son類的析構是虛函式才能夠正確釋放

4樓:匿名使用者

自動呼叫基類部分的析構函式對基類的設計有重要影響。

刪除指向動態分配物件的指標時,需要執行析構函式在釋放物件的記憶體之前清除物件。處理繼承層次中的物件時,指標的靜態型別可能與被刪除物件的動態型別不同,可能會刪除實際指向派生類物件的基類型別指標。

如果刪除基類指標,則需要執行基類析構函式並清除基類的成員,如果物件實際是派生型別的,則沒有定義該行為,要保證執行適當的析構函式,基類中的析構函式必須是析構的。

例如:class a;

class b public a:

則 a* p = new b(), 是可以編譯通過的,但在呼叫析構時需要呼叫b的析構函式,所以a必須定義為虛函式才能正確析構。

c++中 析構函式中可以呼叫虛函式麼

5樓:育知同創教育

c++中 析構

函式中不可以呼叫虛函式。

effective c++ 中有這樣的描述:同樣的原因也適用於析構過程。一旦派生類析構函式執行,這個物件的派生類資料成員就被視為未定義的值,所以 c++ 就將它們視為不再存在。

c++中派生類在構造時會先呼叫基類的建構函式再呼叫派生類的建構函式,析構時則相反,先呼叫派生類的析構函式再呼叫基類的建構函式。

假設乙個派生類的物件進行析構,首先呼叫了派生類的析構,然後在呼叫基類的析構時,遇到了乙個虛函式,這個時候有兩種選擇:plan a是編譯器呼叫這個虛函式的基類版本,那麼虛函式則失去了執行時呼叫正確版本的意義;plan b是編譯器呼叫這個虛函式的派生類版本,但是此時物件的派生類部分已經完成析構,「資料成員就被視為未定義的值」,這個函式呼叫會導致未知行為。

6樓:回頭的世界

很簡單,你定義乙個虛函式,然後在析構函式中呼叫看看,debug除錯,能執行就證明可以!

自己動手比實踐,比問別人「記住」一些規則,更有效果!

7樓:徐霄沛

是可以的,不過,這樣呼叫沒有什麼意義,不能實現多型。

c++中的虛擬析構函式有什麼作用?

8樓:

析構函式同建構函式一樣,也是類的乙個特殊成員函式。它的作用與建構函式相反,用來處理物件的善後工作,並可完成使用者指定的操作,釋放物件的儲存空間(注意不是撤銷空間)。

析構函式的名字是類名前面加上「~」。

析構函式沒有函式型別和引數,沒有返回值,也沒有過載。類中只能有乙個析構函式,可以在內部定義也可以在外部定義。

在物件消亡前系統自動呼叫析構函式,希望析構函式完成的任何操作都必須在定義析構函式中指定。

一般情況下,類的設計者應在宣告類的同時定義析構函式,以指定如何完成「清理」工作。如果程式中不定義析構函式,系統會提供乙個預設的析構函式,它什麼操作都不進行,只用來釋放物件的資料成員所占用的空間。

9樓:匿名使用者

如果不用虛擬析構函式,在類繼承時就會出現基類的構造函式呼叫了,但是派生類的建構函式沒呼叫,派生類的物件中派生部分不會被銷毀,這將導致資源洩漏。

10樓:平填真杯具平男

class father;

class son : public class father;

在上述條件下,可以實現多型

father* pointer = new son;

當釋放時

delete pointer;

在這個時候,如果,father類和son類的析構是虛函式才能夠正確釋放

11樓:匿名使用者

自動呼叫基類部分的析構函式對基類的設計有重要影響。

刪除指向動態分配物件的指標時,需要執行析構函式在釋放物件的記憶體之前清除物件。處理繼承層次中的物件時,指標的靜態型別可能與被刪除物件的動態型別不同,可能會刪除實際指向派生類物件的基類型別指標。

如果刪除基類指標,則需要執行基類析構函式並清除基類的成員,如果物件實際是派生型別的,則沒有定義該行為,要保證執行適當的析構函式,基類中的析構函式必須是析構的。

例如:class a;

class b public a:

則 a* p = new b(), 是可以編譯通過的,但在呼叫析構時需要呼叫b的析構函式,所以a必須定義為虛函式才能正確析構。

c++ 基類析構函式必須得實現嗎?

12樓:匿名使用者

必要性上看,理論上來說,虛構函式不是必須寫明的,特別是在使用視覺化編譯器的時候更是如此,因為如果沒有寫明析構函式,編譯器會在編譯的時候自動生成乙個簡單的析構函式。

但是要明確析構函式非常總要,特別是在涉及到繼承和派生的時候,如果沒有明確給出析構函式,往往會造成編譯器不報錯,程式可以執行,但是容易出現記憶體錯誤的問題。

在涉及的指標操作的時候,如果不寫明析構函式,同樣也會由於編譯自動生成的析構函式過於簡單,從而容易造成在動態分配記憶體的釋放上出現意想不到的記憶體錯誤。

後面兩種情況下的錯誤,編譯器是不會檢查的,就像編譯器永遠不會檢查記憶體溢位錯誤一樣,一旦錯誤發生,不容易找出問題。如果是大型程式,修正這類錯誤非常困難。因而從安全和穩定性而言,析構函式可以說是必須的,可以保證程式在程式設計師的設計下工作,而不會出現無法預料的錯誤。

13樓:匿名使用者

必須實現。 基類的析構函式是必須呼叫的,儘管這個基類是抽象類!

14樓:小小樂師

1,你不帶函式體,編譯器最好也會要它帶上。

2,如果不用指標,那麼這個就不算是基類了。如果是基類,那麼虛析構函式的作用就是為了正確呼叫到派生類的析構函式,以防止

c++中析構函式必須放在類裡面嗎

15樓:西湖釣秋水

如果你自己不實現系統會幫你實現,不過系統實現的析構函式什麼也不做。你自己實現的目的是delete掉你new的東西。比如你有乙個類class test,析構函式就是:~test();

a就是你test類中new的物件.

c++中,析構函式和delete各有什麼作用啊

16樓:開冷桖

我燥!有機會學不好好學,就md來這裡請教?

a肯定是對的,delete對無效位址不影響地處理了。

本來動態必須手動釋放的,可建構函式沒有new,那麼析構不用處理,處理了也不會錯。

其實b好象也對。自己做的,構造沒new,析構沒有delete,有錯麼?

c++的析構期待編譯器?

還不對。。。如果引用了外部new出來的,必須指定為null!

否則。。。一樣的要麼越界,要麼記憶體不能釋放!

反正哥只選a地

17樓:

析構函式釋放宣告的類物件。

delete釋放用new動態記憶體分配的物件,指標等。。。

18樓:你歇比吧

我們在初始化乙個類的時候,這個類的"建構函式" 首先被執行了,也就是說 "建構函式"是開始時執行的,而"析構函式"函式正和它相反,"析構函式"是結束時執行的.

當你用new例項化出來乙個物件的時候,可以用delete 來銷毀這個類的物件,程式就會自動呼叫"析構函式".也就是說delete是和new配合使用的,"new例項化,delete 銷毀.

沒有實用new例項化出來的物件 程式會自動呼叫 "析構函式".

給你個例子吧.

class obj

~obj()

};void main()

C什麼時候需要用到析構函式,C 中析構函式具體是什麼時候被呼叫

有點偏頗.析構函式 是在你的類執行 結束後 再執行的方法。釋放資源只的他的乙個作用之一。必須說這類執行結束了,你操作其它的類或者其它的內容就用到它了。釋放資源只是它作用一種。如果是託管了,系統就會自己幫你釋放的。不過有的程式設計師控制能力比較強,託管的也自己來操作釋放。這樣可以系統資源最大話利用。析...

c 析構函式何時會被呼叫,C 析構函式何時會被呼叫?

析構函式 destructor 與建構函式相反,當物件脫離其作用域時 例如物件所在的函式已呼叫完畢 系統自動執行析構函式。析構函式往往用來做 清理善後 的工作 例如在建立物件時用new開闢了一片記憶體空間,應在退出前在析構函式中用delete釋放 c 中的每個類都會有乙個析構函式,當這個類的物件被銷...

C 中析構函式是先執行子函式還是基函式的記憶體釋放

c 中沒有基函式,子函式的說法。只有基類,繼承類的說法。基類就是父類,繼承類就是子類,繼承類繼承基類的介面和實現。c 的類析構時,會先呼叫繼承類的析構函式,然後再呼叫基類的析構函式。沒有基函式,子函式的說法 只有基類和派生類的說法.或者 父類,子類 構造過程和析構過程是相反的.構造時,先構造基類,再...