答:
test_1.cpp
#include class test
int geti()
int getj()
};int main()
第一次輸出輸出:【無警告,無錯誤】
t1.mi = 1
t1.mj = 16068596
第二次輸出輸出:【無警告,無錯誤】
t1.mi = 1
t1.mj = 4145140
第三次輸出輸出:【無警告,無錯誤】
t1.mi = 1
t1.mj = 16068596
分析:t1.mj 為隨機值
結論
物件的誕生與建構函式是否被執行沒有任何關係。
t雖然執行了建構函式,但建構函式內部是有問題的,導致 t 的初始化狀態不確定,但並沒有影響 t 物件的誕生.
不優雅的解決方法: test_2.cpp
#include class test
int geti()
int getj()
bool status()
};int main()
else
return 0;
}
輸出:
structural abnormality...
本質:強行讓建構函式有乙個返回值,並且手工呼叫 status() 判斷返回狀態
#include class intarray
void set(int index, int value)
void get(int index, int& value)
int length()
~intarray()
};int main()
輸出:
a.length = 5
段錯誤
問題:
對於類的使用者來說並不關心或者熟悉類的內部實現,同時未給出類狀態的判斷方法;
記憶體申請只在極少數情況下會出現申請失敗的情況。
這會帶來極大的困擾並十分難以除錯!!!
需要使用系統資源的操作bool constrcut() // 第二階段建構函式
public:
static twophasecons* newinstance(); // 物件建立函式
};
twophasecons* twophasecons::newinstance()
return ret;
}
#include class twophasecons
bool constrcut() // 第二階段建構函式
public:
static twophasecons* newinstance(); // 物件建立函式
};twophasecons* twophasecons::newinstance()
return ret;
}int main()
intarray.h輸出:
obj = 0x8070008
intarray.cpp#ifndef _intarray_h_
#define _intarray_h_
class intarray
;#endif
main.cpp#include "intarray.h"
intarray::intarray(int len)
bool intarray::construct()
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()
#include #include "intarray.h"
int main()}}
delete a;
return 0;
}
工程上的決定: 物件往往是較大的,因此不應當放在棧空間中,而應當出現在堆空間中輸出:
a->length = 5
b->[0] = 1
b->[1] = 0
b->[2] = 0
b->[3] = 0
b->[4] = 0
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 建構函式執行結束是否意味著物件構造成功?不完美的解決方法...
lessons 27 二階構造模式
建構函式決定的只是物件的初始化,而不是完整物件產生,所以,初始化操作不能按照預期完成而得到的物件,就會產生乙個不完整的物件 即半成品物件 半成品物件是合法的的物件,但是不能使用,也是bug的重要 對於建構函式而言 1 只提供自動初始化成員變數的機會 2 不能保證初始化邏輯一定成功 3 執行retur...