為了在堆上分配乙個cexample物件記憶體空間,呼叫該類的建構函式,如果建構函式 本身就異常退出了,那麼分配給物件的記憶體和建構函式中已經分配的記憶體都將洩漏,因此,c++的建構函式絕對不能發生異常。如果,為了初始化乙個物件,必須 要編寫發生異常的**,例如記憶體分配或讀取可能丟失的檔案,損壞了的配置檔案等,這時候,就需要使用兩段構造了。
一、兩段構造的格式:
編寫乙個類時,將
構造**分為兩部分: 1、
乙個基本的不會發生異常退出的建構函式
這個建構函式將被new操作符呼叫,它隱式的呼叫基類的建構函式,另外還可以呼叫那些不會發生異常退出的函式,也可以以預設值或傳入建構函式的引數來初始化成員變數。2、
乙個類方法(通常稱為
constructl
())
只要通過new操作符分配並構造的物件被壓入了清除棧,該方法就可以單獨呼叫了,它將繼續完成物件的構造過程,這裡面可以安全的執行那些可能發生異常退出的操作。
即使發生了異常,由於之前已經將物件指標入棧,清除棧可以呼叫類的析構函式來釋放所有已經成功分配的資源,並**分配給物件本身的記憶體。
例項:class cexample : public cbase
為了安全和使用上的方便,往往在類的定義裡面新增兩個靜態的函式newl()和
newlc(),作用主要是將兩段構造關聯到一起。
cexample* cexample::newlc()
cexample* cexample::newl()
當然,newl()
和newlc()
函式是可以接受引數的,並可以通過引數來初始化物件。這些引數可以傳遞給簡單建構函式,也可以傳遞給
contructl()
,或者同時傳遞給兩者。
二、使用須知:
如果你的類派生自某基類,而該基類也實現了constructl(),那麼就要保證當物件被構造時,如果需要,基類的constructl()也會被呼叫(
c++能夠保證基類第一段簡單建構函式會被建構函式自動呼叫 ),因此,需要我們自己在constructl()中顯式的(通過域操作符)呼叫所有基類的constructl(),這樣才能保證在初始化派生類物件之前,基類子物件都已經被完全構造了。
程式設計學習三步曲
1 以一種有效的方式學習一種程式語言。2 快速有效的除錯你的 3 時刻不但學習的心態,保持知識的更新。下面我具體的講一講 第一步 以一種有效的方式學習一種程式語言 每個語言都有一些相通的地方。如果我們能夠掌握這些共有的東西,那麼我們就能不費力的學習任何其它的語言。下面是任何一門語言共有的東西.語言的...
Google SEO優化三步曲
google seo優化三步曲 google seo優化,顧名思義,就是針對google搜尋引擎的seo優化,是根據google搜尋引擎的 排名機制進行 的規劃,網頁的設計,以確保 一 的組成 這是最重要的一點,因為它從很多程度上影響你的 在搜尋引擎排名的位置,的組成包括很多部分,比如內鏈的建設,u...
線纜故障查詢三步曲
線纜故障查詢三步曲 在日常的網路維護中 包括網路初期安裝後期擴容 經常面對的乙個問題是某個網路埠或者某一條電纜具體連線到什麼位置。一種情況是在網路現場需要知道網路埠連線到配線架的什麼位置,或者是配線架上的一條電纜連線到那個辦公室。目前,網路維護技術人員還在使用 基於30 年前的模擬技術的老式線纜故障...