2014年11月30日 星期日

建構子(Contructor)與解構子(Destructor)的執行(C++)

C++的建構子會在宣告class變數時執行,解構子則會在class不再被使用時執行,兩者皆無法像其他函式那樣直接呼叫。雖然看起來定義很單純,但若考慮各種情況,其實還是挺複雜的。

這裡列舉幾種情形:

先宣告一個類別

接著宣告類別變數
得到的結果為(綠色文字為自行加入的註解)
以上是較單純的情形,特別的是當宣告時若用指定運算做初始化,建構子將不會執行。
若改為在宣告時放入引數
此時會根據引數格式決定執行哪個建構子
這其實就是函式重載(overload)的觀念。
接下來,我們將問題延伸至繼承的情況,並宣告一個衍生類別
當宣告子類別時
則父與子類別的建構子與解構子都會執行。
請注意建構子是先父後子,解構子則是先子後父。
此外,父類別預設會執行無引數建構子,故在父類別中,可以毫無建構子,或是有建構子時,也至少要有無引數建構子。否則子類別就必須在建構子中指明要執行父類別的哪個建構子,例如下面的宣告
所得到的結果中,可發現程式執行了另一個父類別建構子。

這裡的重點在於子類別的建構子中,加入了指明呼叫哪個父類別建構子的敘述
接著來看動態配置的情況,若以父類別指標配置子類別物件時
會發現子類別的解構子不會被執行
若想避免這樣的情形,可將父類別的解構子改為虛擬解構子
此時若做同樣的事
父與子類別的解構子就都能執行了。
寫物件導向程式時,常會因為建構子與解構子的問題而造成錯誤,特別是針對動態配置。因此,弄清楚各種情形下的執行方式是有必要的。

沒有留言:

張貼留言