C 深度解析 17 二階構造模式

2021-10-02 11:13:04 字數 2432 閱讀 7346

2 二階構造

3 小結

首先我們思考乙個問題?在建構函式中執行 return 語句會發生什麼?建構函式執行結束是否意味著物件構造成功?

程式設計實驗:異常的建構函式

// 17-1.cpp

#include

class

test

intgetx()

intgety()

private

:int x;

int y;};

intmain()

在建構函式中完成了對 x 的初始化後建構函式 return,也就是說建構函式沒有完成全部的初始化任務,這會出現什麼結果呢?

$ g++ 17-1.cpp -o 17-1

$ ./17-1

t.getx() = 1

t.gety() = 32766

從結果可以看到,雖然建構函式異常,但是依然生成了物件,x 的值完成初始化,y 的值為隨機值。

也即是說,建構函式只提供自動初始化成員變數的機會,並不保證初始化邏輯一定成功。執行 return 語句後建構函式立即結束。

半成品物件概念

建構函式可分為兩種:

二階構造如下圖所示:

建立物件時,先進行第一階段的構造,完成資源無關的初始化操作。然後再進行二階段的構造,申請系統資源。如果申請成功,就返回這個物件,不成功時刪除半成品物件

具體操作如下:

將類名的建構函式作為第一階段的建構函式,完成資源無關的初始化操作,另外定義乙個第二階段的建構函式,當申請系統資源成功時返回 true,失敗返回 false。第一階段的建構函式和第二階段的建構函式均為私有。

定義乙個公有的物件建立函式,首先呼叫第一階段的建構函式建立物件,再呼叫第二階段的建構函式,根據返回值判斷構造是否成功。成功返回物件的指標,失敗返回 null。

下面我們就來編譯執行一下:

// 17-2.cpp

#include

class

twophasecons

bool

construct()

public

:static twophasecons*

newinstance()

;};twophasecons* twophasecons::

newinstance()

return ret;

}int

main()

$ g++ 17-2.cpp -o 17-2

$ ./17-2

obj = 0x55b7ce853e70

// intarray.h

#ifndef _intarray_h_

#define _inrarray_h_

class

intarray

;#endif

#include

"intarray.h"

#include

intarray::

intarray

(int len)

bool intarray::

construct()

}else

return ret;

}intarray* intarray::

newinstance

(int length)

return ret;

}int intarray::

length()

bool intarray::

get(

int index,

int& value)

return ret;

}bool intarray::

set(

int index,

int value)

return ret;

}intarray::

~intarray()

// 17-3.cpp

#include

#include

"intarray.h"

intmain()

delete t;

return0;

}

1、建構函式中的初始化操作的失敗不影響物件的誕生

2、半成品物件是 bug 重要**

3、二級構造將初始化過程分為兩部分,確保建立的物件都是完整初始化的

C 深度解析 17 二階構造模式

1.建構函式的回顧 2.面試題 2.在建構函式中執行return語句會發生什麼?3.建構函式執行結束是否意味著物件構造成功?includeclass test int geti int getj int status int main getchar return 0 3.你該知道的真相真相的意義 ...

二階構造模式

我們在建立物件的時候,需要呼叫建構函式,對物件做初始化,但是建構函式是沒有返回值的,無法判斷建構函式的執行結果。如果建構函式執行過程中,發生了異常,導致函式提前返回了,那麼這種情況下,我們建立的物件會處於什麼狀態。1.建構函式確定對物件做初始狀態,物件的建立與建構函式無關,也就是說儲存物件的那片記憶...

二階構造模式

模式 方法。設計模式,就是設計方法。前人證明了的行之有效的方法。建構函式 1.關於建構函式 類的建構函式用於物件的初始化。建構函式與類同名並且沒有返回值。建構函式在物件定義時自動被呼叫。問題 1.如何判斷建構函式的執行結果?2.在建構函式中執行return語句會發生什麼?3.建構函式執行結束是否意味...