1樓:
在vc中除錯的話,你可以主動刪除物件,這樣就會呼叫解構函式int main()
修改為int main()
2樓:匿名使用者
如樓上所說,如果你的程式視窗是在程式執行後立即關閉的話,你肯定看不到呼叫解構函式的資訊.因為解構函式的呼叫是在main結束後,也就是system("pause");執行後,而不是你想像的那樣先呼叫,然後再執行system("pause");等待你的輸入.
不知道為什麼大家的程式視窗都會自動關閉,至少在我機子上視窗不會關閉,會顯示press any key to continue
3樓:
解構函式在main函式返回時候呼叫,在暫停之後才呼叫,然後就返回了,你可能沒看到
4樓:焉湉湉
不知道為什麼大家的程式視窗都會自動關閉,至少在我機子上視窗不會關閉,會顯示press any key to continue
在ide的debug模式下執行那個視窗不會關閉的,這是ide的一個功能
5樓:匿名使用者
system("pause")是暫停的意思,按任意鍵後如回車,就可出現解構函式。
解構函式在何時呼叫?
6樓:西西哩的小馬甲
1、物件生命週期結束,被銷燬時;
2、delete指向物件的指標時,或delete指向物件的基類型別指標,而其基類虛構函式是虛擬函式時;
3、物件i是物件o的成員,o的解構函式被呼叫時,物件i的解構函式也被呼叫。
c++當中的解構函式格式如下:
如以下定義是合法的:
當程式中沒有解構函式時,系統會自動生成以下解構函式:
《類名》::~《類名》(){},即不執行任何操作。
下面通過一個例子來說明一下解構函式的作用:
最後輸出:解構函式被呼叫。
cin.get() 表示從鍵盤讀入一個字元,為了讓我們能夠看得清楚結果。當然,解構函式也可以顯式的呼叫,如 (*t).~t(); 也是合法的。
解構函式怎麼用,在c++中的
7樓:
解構函式是一個類的例項銷燬的時候,被自動呼叫的函式,一般用來做一些清理性的工作。
8樓:貓與豬的世界
就是呼叫完類的實體物件後,需要呼叫解構函式
9樓:影視動作秀
解構函式,就是善後處理,該物件的生命週期結束了,它負責善後的一些工作,如釋放已分配的記憶體等。你將該物件delete掉時,解構函式就自動執行了,不用你去呼叫它的。
簡單的舉個例子:
假如有class test
~test()
}那麼在mian 函式中,你new 了一個 test 物件後,再將它delete 掉,這時解構函式~test();就自動執行了,釋放 a 的記憶體,並列印出"解構函式執行了"。
c++中解構函式在成員函式中的呼叫問題
10樓:
因為第二種方法你沒有定義拷貝建構函式,所以ab operator = (int a)執行完之後,返回的是return *this,會在記憶體中再次構造一個ab的物件,並且把*this指向的物件按位拷貝給這個物件,建立這個物件的時候,會用到x=new int[2]分配一段記憶體。由於有a=3;會再次呼叫按位拷貝函式把這個物件幅值給a,賦值完成後,這個物件析構,所以它的成員被重置為隨機數,a中x所指向的也為隨機數(因為是按位拷貝的)所以輸出為隨機數。你可以把ab operator = (int a)這個函式的返回值改為引用型別,就可以輸出不是隨機數,即:
ab& operator = (int a)
11樓:匿名使用者
ab operator = (int a)這裡返回的是*this 那麼返回型別肯定是對ab類物件的一個引用啊,需要改成
ab& operator = (int a)才行
12樓:匿名使用者
賦值運算子改為:
ab& operator = (int a)就ok了。
賦值運算子的返回值不是引用的話,return *this;時會呼叫隱式拷貝建構函式:
ab(const ab &t)
生成類ab的臨時物件,臨時物件析構時,臨時物件的x[0]變為隨機數,因為物件a的x和臨時物件的x的值是一樣的,所以a.x[0]也變為隨機數了。物件a也析構了一次,所以析構了兩次。
c++程式子類析構時會呼叫父類的解構函式麼?
13樓:東哥
c++程式子類析構時會呼叫父類的解構函式。
解構函式呼叫的次序是先派生類的析構後基類的析構,也就是說在基類的的析構呼叫的時候,派生類的資訊已經全部銷燬了定義一個物件時先呼叫基類的建構函式、然後呼叫派生類的構造 函式;析構的時候恰好相反:先呼叫派生類的解構函式、然後呼叫基類的解構函式。
解構函式:
解構函式(destructor) 與建構函式相反,當物件脫離其作用域時(例如物件所在的函式已呼叫完畢),系統自動執行解構函式。解構函式往往用來做「清理善後」 的工作(例如在建立物件時用new開闢了一片記憶體空間,應在退出前在解構函式中用delete釋放)。
14樓:
構造的時候要構造父類,那麼析構的時候也要析構父類了……
15樓:匿名使用者
先呼叫自身再呼叫父類
c++ 的類中,在建構函式中呼叫解構函式會發生什麼情況?
16樓:匿名使用者
就跟呼叫成員函式一樣, 在語法上是可行的
但是由於解構函式的功能,在語義上可能會有無法預料的結果因為在物件銷燬時會隱式呼叫一次,可能會出問題同時考慮這個(偽**)
class a~a}
這個屬於合法不合理的事,除非你析構設計的就是想隨時呼叫都沒事。
17樓:匿名使用者
無論是在基類還是在子類,類的解構函式都是不允許被顯式呼叫的,當你定義了一個指向自定義類的物件的指標,只有在釋放這個指標所指向的物件時,類的解構函式才會被編譯器隱式呼叫。所以永遠不要期望自己手式呼叫類的解構函式!!!
18樓:
建構函式用於對物件中的變數賦初值,
解構函式用於釋放所定義的物件的所有記憶體空間。
建構函式和解構函式都不需要使用者呼叫的,建構函式在定義物件時自動呼叫,解構函式當物件的生存期結束的時候會自動的呼叫。
看看下面的**吧:
c++類:
#include
class xx
xx() //過載建構函式
void x(); //公有成員函式};void xx::x() //屬於xx類的公有成員函式x的函式體
void main()
19樓:匿名使用者
當物件脫離其作用域時(例如物件所在的函式已呼叫完畢),系統自動執行解構函式。
解構函式作用:用來做「清理善後」 的工作(例如在建立物件時用new開闢了一片記憶體空間,應在退出前在解構函式中用delete釋放)。
在c++中:
解構函式名也應與類名相同,只是在函式名前面加一個位取反符~,例如~stud( ),以區別於建構函式。它不能帶任何引數,也沒有返回值(包括void型別)。只能有一個解構函式,不能過載。
如果使用者沒有編寫解構函式,編譯系統會自動生成一個預設的解構函式(即使自定義了解構函式,編譯器也總是會為我們合成一個解構函式,並且如果自定義了解構函式,編譯器在執行時會先呼叫自定義的解構函式再呼叫合成的解構函式),它也不進行任何操作。所以許多簡單的類中沒有用顯示的解構函式。
20樓:匿名使用者
解構函式是不能顯示呼叫的
只有系統自動呼叫
21樓:枚高陽蒯瑪
解構函式主要作用就是釋放資源,避免記憶體洩漏如果你的類裡面只用到的基本型別,如int
char
double等,系統的預設解構函式其實什麼都沒有做但如果你使用了其他的類如vector,string等,系統的預設解構函式就會呼叫這些類物件的解構函式
如果是自己寫解構函式的話,如果你的類裡面分配了系統資源,如new了記憶體空間,開啟了檔案等,那麼在你的解構函式中就必須釋放相應的記憶體空間和關閉相關的檔案;這樣系統就會自動呼叫你的解構函式釋放資源,避免記憶體洩漏
c解構函式何時呼叫,C 解構函式何時呼叫
建構函式是建立的時候也就是new的時候呼叫,析構是釋放也就是delete的時候呼叫,你new的話應該是呼叫建構函式 也就是 date date int i 程式第39行,people的建構函式裡面有一行date birthday 1 建立了一個date類的臨時變數。當函式退出的時候,這個變數也會被撤...
c 中解構函式在成員函式中的呼叫問題
因為第二種方法你沒有定義拷貝建構函式,所以ab operator int a 執行完之後,返回的是return this,會在記憶體中再次構造一個ab的物件,並且把 this指向的物件按位拷貝給這個物件,建立這個物件的時候,會用到x new int 2 分配一段記憶體。由於有a 3 會再次呼叫按位拷...
深度分析c 解構函式的作用,深度分析C 解構函式的作用
這樣的問題,有一個最實用的方法,就是去跟一下彙編的 當然了這需要你懂一點點的組合語言.問題的原因就是 當你呼叫基類的解構函式d.base base 時,c 會先把d物件中的虛擬函式表改變一下,原來指向derived類的虛擬函式表,現在指向base類的虛擬函式表.彙編 為 004116e3 mov e...