Effective_C++:12、在構造函數中儘量以initialization(初始化)動作取代assignment(賦值)動作

12、在構造函數中儘量以initialization(初始化)動作取代assignment(賦值)動作

1、initialization(初始化)動作

        首先,得強調一下,初始化動作是在構造函數中使用的。僅當定義構造函數時,有兩種方式將類的數據成員賦予某個特定的值(儘量使用成員初始化列表):
        1.使用初始化動作,即成員初始化列表。此時,是將該數據直接初始化爲特定值,即調用該數據類型的某個構造函數將其值初始化爲特定值。
        2.在構造函數中進行賦值動作。此處,就是執行數據的賦值動作,即調用數據類型的賦值操作符。
        構造函數,分兩步執行:
        1.首先,數據成員初始化。即將類中的數據成員都進行初始化,若在成員初始化列表中,則調用對應的構造函數來初始化該數據;若不在成員初始化列表中,調用默認構造函數來初始化該數據。
        2.執行構造函數的代碼語句。
        由上可知,執行構造函數前會先調用數據成員的構造函數進行初始化,初始化完成再執行該構造函數的函數體。

2、爲啥要儘量以initialization(初始化)動作取代assignment(賦值)動作

        初始化動作是調用構造函數對數據進行初始化,賦值動作是調用賦值操作符對數據進行賦值操作。故從以下方面考慮,應以以initialization(初始化)動作取代assignment(賦值)動作:
        1.const成員和reference成員必須使用成員初始化列表。因爲他們只能被初始化,不能被賦值。
        2.初始化動作比賦值動作更快,效率高。構造函數首先進行初始化,然後執行函數體。故初始化動作是直接將數據初始化爲特定的值,調用對應的構造函數;而賦值動作是在其被初始化後再進行賦值操作,調用了默認構造函數和賦值操作符。
        然而,總有例外:當類中有一大堆內建型別的數據成員時,成員初始化列表將比較龐大,容易出錯且不方便維護。爲此,可以寫一個private初始化函數,對這些數據進行初始化,在構造函數中調用初始化函數即可。
        最後,記得static成員是絕對不能在構造函數中被初始化的,因爲他是類對象共同擁有,每次程序只初始化一次,故每次創建對象對他進行初始化是不合理的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章