第27課 二階構造模式

2021-10-03 01:49:00 字數 2813 閱讀 9712

本文內容取自於對狄泰學院 唐佐林老師 c++深度解析 課程的學習總結

關於建構函式如判斷

建構函式 的執行結果?

在建構函式中執行 return 語句會發生什麼?

建構函式執行 結束是否意味著 物件構造成功?

為什麼了回答這幾個問題,我們編寫乙個建構函式,並且建構函式中新增return 語句

#include

class

test

;test::

test

(int i,

int j)

:m_i(0

),m_j(0)

int test::

geti()

int test::

getj()

intmain

(void

)

執行結果

程式第27行給建構函式使用 return 強制返回,結果是 構造 t1 物件時,t1的m_j成員變數並沒有成功賦值為2,依然為初始化時的0。 m_i 成功賦值。

所以 t1 物件並沒有完全構造成功,而是乙個半成品物件 。

實驗結論

建構函式

建構函式能決定的 只是物件的初始狀態

而不是物件的誕生!!!

半成品物件 的概念

為了說明半成品物件的危害,我們來做個實驗

首先實現乙個陣列類,實驗構造陣列長度,設定陣列元素值,獲取資料元素值,獲取陣列長度功能。

array.h

#ifndef __array_h__

#define __array_h__

class

array

;#endif

array.cpp

#include

"array.h"

array::

array

(int len)

bool array::

setarrayval

(int index,

int val)

bool array::

getarrayval

(int index,

int& val)

int array::

getarraylen()

main.cpp

#include

"array.h"

#include

intmain

(void

)for

(int i=

0; i

getarraylen()

; i++

)return0;

}

執行結果:

實驗結果:成功的實現了我們預期的結果,構造了乙個長度為5的陣列物件,並對該物件元素進行賦值。

現在,我們來人為製造半成品物件,假設構造物件時建構函式中 申請陣列堆記憶體失敗,會發生什麼情況

執行結果

實驗結論:由於堆記憶體申請失敗,設定陣列元素值時操作空指標導致程式段錯誤

因為建構函式沒有返回值,我們無法獲知堆記憶體申請的結果,為了避免這種情況

我們增加了二階構造模式

工程開發中的 構造過程 可分為

1.資源無關 的初始化操作

不可能出現異常情況 的操作

2. 需要使用系統資源 的操作

可能出現異常情況,如:記憶體申請,訪問檔案等

二階構造過程

二階構造示例

物件建立函式示例

下面,我們將剛才的**做二階構造改寫

1.在array.h中增加二階構造介面

在array.cpp中實現二階構造介面

在main.cpp中呼叫物件建立函式進行物件的建立

執行結果

利用二階構造模式 可以對物件建立結果進行判斷,避免生成半成品物件而導致程式異常的發生

第27課 二階構造模式

1 類的建構函式用於物件的初始化 2 建構函式與類同名並且沒有返回值 3 建構函式在物件定義時自動被呼叫 1 如何判斷建構函式的執行結果?在類中新增乙個標誌 bool 放在建構函式的末尾 判斷函式體是否全部執行 通過功能成員函式判斷標誌狀態。這種方式能夠完成功能,但是設計不夠優美,需要手工進行判斷,...

27 二階構造模式

範例 異常的建構函式 include class test int geti int getj int status int main int argc,const char argv return 0 工程開發中的構造過程可分為 二階構造示例 class twophasecons bool con...

27 二階構造模式

關於建構函式 用於物件的初始化,與類同名並且沒有返回去,物件被定義時自動呼叫。1 如何判斷建構函式的執行結果?沒有辦法,2 建構函式中執行return語句會發生什麼?可以存在return語句,遇到return會立即返回,後邊的語句不會執行。3 建構函式執行結束是否意味著物件構造成功?不完美的解決方法...