物件宣告及建立成員變數初始化和構造方法執行順序

2021-10-08 05:46:33 字數 766 閱讀 8185

子類構造方法顯示呼叫父類構造方法並傳遞子類成員變數,編譯器報錯並提示將傳遞的成員變數用static修飾。錯誤原因顯示呼叫建構函式時,不能引用例項字段。涉及到物件宣告和建立時,類載入時類屬性初始化、父子類物件屬性的初始化及父子類的構造方法執行的順序。

由static修飾的屬性和方法所屬為其所在類,在記憶體中只有乙份,為類所建立的所有物件共享,隨類的載入先對static修飾內容初始化,繼承中先初始父類的static,之後初始子類static內容。

呼叫父類構造方法雖然在子類構造方法第一行,但執行時更靠前,如果加上構造**塊進行比較,構造**塊執行在構造方法之前,父子類的構造**塊和構造方法的執行順序應為 構造**塊(父類)-> 構造方法(父類) -> 構造**塊(子類)-> 構造方法(子類)。成員變數的初始化在各自構造**塊之前。

最終執行順序為:static(父類)-> static(子類)-> 成員變數初始化(父類)-> 構造**塊(父類)-> 構造方法(父類) -> 成員變數初始化(子類)-> 構造**塊(子類)-> 構造方法(子類)。

顯示呼叫建構函式時,不能引用例項字段。例項字段初始化之後才可使用,是在父類構造方法執行時,子類成員變數未被初始化,而靜態修飾的子類屬性初始化是先於父類構造方法執行。

測試:

class

fupublicfu(

)}class

ziextends

fupubliczi(

)}

測試結果:

c 中成員物件初始化和類繼承初始化

對於繼承的物件,建構函式在成員初始化列表中使用類名來呼叫特定的基類建構函式。對於成員物件,建構函式則使用成員名。例如 ifndef h frabjous define h frabjous include class frabjous virtual void tell gloam gloam in...

C 類的成員變數在宣告時初始化

能。可能早先的版本不能,但是c 11標準下能。有人說在宣告的時候初始化相當於在建構函式中初始化,其實不是的,成員變數初始化的順序為 先進行宣告時初始化,然後進行初始化列表初始化,最後進行建構函式初始化,如下 另外初始化列表中初始化的順序是和變數宣告的順序一樣,而與列表中的順序無關 include u...

區域性變數和成員變數初始化的不同

1.區別 值型別的 區域性變數必須初始化,成員變數宣告時預設初始化。也就是說,區域性變數使用前,必須賦值。而成員變數 會預設賦值,不必須。2.預設值是什麼?成員變數中里的,基本數值型別預設初始值為0,string等非基本型別初始化為null。why?值型別在棧中,值在是在棧中。而string等引用型...