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.建構函式執行結束是否意味...