7.2 派生類的構造函數和析構函數
1派生類構造函數的一般格式如下:
<派生類名>::<派生類名>(<總參數表>):<基類名1>(參數表1),
……
<基類名n>(<參數表n>),
<成員對象名1>(<參數表n+1>),
……,
<成員對象名m>(<參數表n+m>)
{
<派生類構造函數體>
}
派生類的構造函數名與類名相同。在構造函數的參數表中,給出了初始化基類數據、成員對象數據以及新增的其他數據成員所需要的全部參數。在參數表之后,列出需要使用參數進行初始化的基類名和成員對象名以及各自的參數名,各項之間使用逗號分隔。注意對基類成員和新增成員對象的初始化必須在成員初始化列表中進行。
當派生類有多個基類時,處于同一層次的各個基類的構造函數的調用順序取決于定義派生類時聲明的順序(自左向右),而與在派生類構造函數的成員初始化列表中給出的順序無關。如果派生類的基類也是一個派生類,則每個派生類只需負責它的直接基類的構造,依次上溯。
當派生類中有多個成員對象時,各個成員對象構造函數的調用順序也取決于在派生類中定義的順序(自上而下),而與在派生類構造函數的成員初始化列表中給出的順序無關。
建立派生類對象時,構造函數的執(zhí)行順序如下:
(1)執(zhí)行基類的構造函數,調用順序按照各個基類被繼承時聲明的順序(自左向右);
(2)執(zhí)行成員對象的構造函數,調用順序按照各個成員對象在類中聲明的順序(自上而下);
(3)執(zhí)行派生類的構造函數。
派生類的構造函數只有在需要的時候才必須定義。派生類構造函數提供了將參數傳遞給基類構造函數的途徑,以保證在基類進行初始化時能夠獲得必要的數據。因此,如果基類的構造函數定義了一個或多個參數時,派生類必須定義構造函數。
如果基類中定義了缺省構造函數或根本沒有定義任何一個構造函數(此時,由編譯器自動生成缺省構造函數)時,在派生類構造函數的定義中可以省略對基類構造函數的調用,即省略“<基類名>(<參數表>)”。成員對象的情況與基類相同。
當所有的基類和成員對象的構造函數都可以省略,并且也可以不在成員初始化列表中對其他數據成員進行初始化時,可以省略派生類構造函數的成員初始化列表。
2派生類的析構函數
與構造函數相同,派生類的析構函數在執(zhí)行過程中也要對基類和成員對象進行操作,但它的執(zhí)行過程與構造函數嚴格相反,即:
(1)對派生類新增普通成員進行清理。
(2)調用成員對象析構函數,對派生類新增的成員對象進行清理。
(3)調用基類析構函數,對基類進行清理。
派生類析構函數的定義與基類無關,與沒有繼承關系的類中的析構函數的定義完全相同。它只負責對新增普通成員的清理工作,系統(tǒng)會自己調用基類及成員對象的析構函數進行相應的清理工作。
編輯推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |