C 抽象機制 物件,析構函式,預設建構函式

2021-06-21 15:15:52 字數 1172 閱讀 1073

1.物件

物件的建立存在多種可能方式。有些物件是區域性變數,有些是全域性變數,有些是類的成員,如此等等。初始化物件用到建構函式,在它們變得不可用時清理它們使用析構函式。

1.2 析構函式

建構函式完成對像的初始化,它建立起一種成員函式將在其中進行操作的環境。有時建立這樣的環境涉及到申請某些資源——例如,乙個檔案,乙個鎖或者乙個儲存——這些資源在使用之後必須釋放。這樣,有些類裡就需要有乙個函式,並需要保證它將在每個物件被銷毀之前得以呼叫,就像建構函式能夠得到類似保證,在物件建立是必定被呼叫一樣。按照這個習慣,這個函式被稱為析構函式,它通常完成一些清理和釋放資源的工作。當以個自動變數離開其作用域時,當乙個位於自由儲存的物件被刪除是,還有在其他類似情況中,析構函式都將被隱式地呼叫。只有非常特殊的情況下,使用者才需要去顯示地呼叫析構函式。

析構函式的最簡單的用途是為了釋放建構函式請求的儲存空間。考慮乙個以某種型別name為元素的簡單的表table。table的建構函式必須為儲存其元素分配儲存,而到最後,當這種表被刪除的時候,我們就必須保證這些儲存能**,以便將來再用。

我們做到這一點的方式就是提供乙個與建構函式互補的特殊函式:

class name;

class table  //建構函式

~table() } 

析構函式的記法形式~table() 採用求補的符號最為提示,以表明析構函式與建構函式tabel()之間的關係。

1.3 預設建構函式

類似的,也可以認為大部分型別都有乙個預設建構函式。預設建構函式就是呼叫時不必提供引數的建構函式。如果使用者自己宣告了乙個預設建構函式,那麼就會去使用它;否則,如果有必要,而且使用者沒宣告其他的建構函式,編譯器就設法去生成乙個。

編譯器生產的預設建構函式將隱式地位類型別的成員和他的基類呼叫有關的預設建構函式。例如,

strcut tables;

tables tt;

這裡的tt將被用乙個生成出來的預設建構函式初始化,該建構函式為tt.t1以及tt.vt的每個成員呼叫table(15)。另一方面,它不會去初始化tt.i和tt.vi,因為它們不是類型別的物件。對於類型別和內部型別區別對待是為了與c的相容性,為了避免執行時的額外開銷。

由於const和引用必須進行初始化,包含const或引用成員的類就不能進行預設構造,除非程式設計師顯示地提供了預設建構函式。例如,

struct x

x x;//錯誤:無缺省建構函式。

C 預設析構函式

1.與建構函式一樣,假如我們不指定自己的析構函式,那麼編譯器將為我們建立乙個預設析構函式。析構函式 destructor 也是一種特殊的成員函式,沒有返回值,不需要使用者呼叫,而是在銷毀物件時自動執行。與建構函式不同的是,析構函式的名字是在類名前面加乙個 符號。注意 析構函式沒有引數,不能被過載,因...

C 建構函式 析構函式 虛析構函式

一般地,建立物件和刪除物件時,父類建構函式 子類建構函式 子類析構函式 父類析構函式。特例 如果用new建立了乙個物件,並將父類的指標指向這個子類的物件,那麼用delete撤銷物件時,系統只執行基類的析構函式,而不執行派生類的析構函式。如果希望按照子類析構函式 父類析構函式的順序執行,那麼應該將基類...

C 構造 析構函式

建構函式 與普通函式相比有三點不同。和定義的結構體 類名字完全一樣。沒有返回值。呼叫的時機 建立乙個物件的時候,對結構體內的物件賦值,初始化用的。而成員函式print 是建立完物件再呼叫。建構函式不是必須有的,但是一旦定義了建構函式,在建立物件的時候必須要用,否則報錯。如果即想有建構函式,建立物件的...