#include using namespace std;
int i;
class a};
int foo()
int main()
<
上述程式的輸出結果:
i = 3
為何結果是3,而不是10?
當從乙個函式返回時,析構函式屬於乙個最後才被執行的方法。當i值已經拷貝給函式的返回值(return value)之後,ob的析構函式才會被呼叫。
因此,在析構函式將i值修改為10之前,foo就已經獲取到了i的當前值3,因此輸出為i = 3。
如何使得程式可以輸出i = 10?
可以使用下面的幾種方法:
#include using namespace std;
int i;
class a};
int& foo()
int main()
#include using namespace std;
int i;
class a};
int foo()
return i;}
int main()
因為物件ob是在塊中建立的,則塊作用域結束時,會呼叫物件ob的析構函式,此時i值會被修改為10。最後做為返回值進行返回。
int foo()
int foo()
注意:使用此方法,編譯時需要帶上--no-elide-constructors選項。
C 建構函式 析構函式 虛析構函式
一般地,建立物件和刪除物件時,父類建構函式 子類建構函式 子類析構函式 父類析構函式。特例 如果用new建立了乙個物件,並將父類的指標指向這個子類的物件,那麼用delete撤銷物件時,系統只執行基類的析構函式,而不執行派生類的析構函式。如果希望按照子類析構函式 父類析構函式的順序執行,那麼應該將基類...
c 構造與析構函式
一.建構函式與析構函式 1 c 中的類可以定義與類名相同的特殊成員函式,這種函式叫做建構函式。2 建構函式在定義時可以有引數。3 沒有任何返回型別的宣告。4 一般情況下系統會自動呼叫,在一些情況下會收手動呼叫。建構函式有無參構造,有參構造,賦值 拷貝建構函式。include using namesp...
建構函式 析構函式 虛析構函式
說析構函式之前,先說下建構函式。建構函式用來完成對物件的一系列初始化操作,主要作用有 1.給建立的物件建立乙個識別符號 2.為物件資料成員開闢記憶體空間 3.完成物件資料成員的初始化 當並未顯示的定義建構函式時,會生成乙個預設的建構函式,預設建構函式不能完成物件資料成員的初始化,只能給物件建立一識別...