c 關於解構函式,我有些不明白,請高手指點

2023-01-11 09:30:40 字數 1162 閱讀 2707

1樓:**的可樂

第一,關於析構

樓上二位基本說的沒錯,c/c++中,大括號限定了其中變數的生存週期,以你的**為例

/*1*/int main()

/*2*/

變數one和two在第3行被宣告並初始化(可以比喻成小孩出生了,此時建構函式被呼叫)

在第5行的右大括號之前,這兩個變數「活到頭了」,此時解構函式被呼叫。

換句話說,大括號之間的任何變數,都會在右括號之前被銷燬並釋放空間,除非程式設計師顯式的呼叫其解構函式。

第二,關於指標

對於one(4,5),這句執行時,系統按以下步驟進行:

1,分配一個未初始化的空間給one,大小為sizeof(rectangle),其中的整型指標width和height未被初始化(注意,此時其值並非null)

2,執行建構函式one.rectangle(),變數width和height被分別分配到一個整型大小的空間,其值為其對應空間的首地址(比如0x00223344和0x00223346)

3,將4和5填入上面兩塊空間

在解構函式被隱式的執行時(即在最後一句語句之後,main函式右大括號之前),delete語句僅僅是釋放了對應指標的空間,針對上面舉的例子來講,析構以後,one.width依然存在,這也就意味著one.width依然可以被引用,只不過已經不等於0x00223344了,注意,此時它也不等於null,其指向的內容是未知的。

但是,現在大多數編譯器都會避免在指標被delete之後引用,因此雖然上面我們說的引用方法在理論上是有效的,但實際上並不可行。

(多嘴說一句,使用debug工具檢視程式的執行過程可以發現,微軟一般把未定義的指標賦值為0xcccccccc,系統發現該地址被引用就要跳出非法操作了,^ ^)

2樓:愛笑死人了

int main()

建構函式呼叫了,但析購函式未被呼叫。當使用delete one和delete two時會析構one和two,或者就過了存在週期,這裡是main函式執行完自動呼叫解構函式;

3樓:義薄雲天黃河

還是你例項化物件的width和height;因為物件的生命週期到main()函式結束以後,生命週期結束呼叫解構函式,另外說一點,構函式不是把width height這兩個指標指向的值給刪除了,是把申請的weight和height的空間給釋放掉了!

解構函式可以過載嗎,C建構函式和解構函式可以過載嗎

c 嗎,不能過載析構bai函式,只能聲du明為虛擬函式,為了多型zhi發生時dao能夠完全析構 只有構回 造函式才能重答 載,用於多種方式構造物件 如果通過基類指標動態構造公有派生類物件,再通過基類指標來動態釋放該物件就會發生這個問題,原因和過程很多教科書上都有,此時,基類的解構函式就要定義為vir...

c中解構函式是上波浪還是中波浪?怎麼打出來

c 解構函式就是波浪鍵加類建構函式。鍵即鍵盤上的shift 鍵。具體是上波浪還是中波浪可能因文字編輯器的不同而導致打出來的顯示效果不同。比如1.visual studio 2015中波浪線顯示為上波浪線2.vc6.0 中波浪線顯示為上波浪線 3.notepad 中波浪線顯示為中波浪線雖然顯示方式有所...

單繼承和多繼承的派生類建構函式和解構函式的構造規則和執行順序是怎樣的

多繼承派生類建構函式的執行順序是先執行所有基類的建構函式 順序按照定義派生類時指定的各基類順序 再執行派生類的建構函式,解構函式執行順序,與建構函式完全相反 因為,資料是按棧儲存的 單繼承先執行基類建構函式,在執行派生類建構函式,解構函式執行順序與建構函式相反。當基類的建構函式沒有引數,或沒有顯式定...