C++建構函式與初始化列表

來源:互聯網
上載者:User
        C++引入建構函式的目的在於對變數的初始化做出強制,因為人們發現,程式的錯誤,很大程度上來說,都是由變數沒有初始化造成的。

        因此,一種很好的編程習慣就是,在定義變數的時候直接初始化。而在C++中,在變數定義時,系統會自動調用變數的建構函式對變數進行初始化。只要將相應的初始化代碼放在建構函式中,就能夠保證該類在執行個體化對象的時候能夠給對象賦以理想的初值。

        而事實遠遠沒有這麼簡單。

        實際上,程式在進入建構函式的大括弧體時,就已經完成了變數的定義(也就是分配記憶體空間)。這就難免會造成這樣的一種情況:在對象被構造時,程式進入建構函式大括弧體之前,首先調用對象的default建構函式,然後進入建構函式體內,重新對變數進行賦值。這無疑降低了程式的效率。

        還有更糟糕的情況。

        如果一個對象必須經由一個非default建構函式進行定義才能夠在將來被正常地賦值,而系統預設地調用了它的default建構函式,就會出現很大的錯誤。

        因此,C++的設計者引入了建構函式初始化列表的概念。也就是說,在建構函式的初始化列表之中進行的是對變數的定義與初始化(分配記憶體空間),而不是簡單的賦值。這樣就能夠解決上述的效率以及對建構函式的選擇的問題。

        這一點在MFC中體現得尤為明顯。繼承的類一般會在初始化列表中調用能夠其父類的建構函式。

        應為在初始化列表中發生的是成員變數的定義,也就是分配空間,因此初始化列表中構造的順序與實際編譯器定義變數的順序可能是不一致的,也就是說,編譯器不會按照設計者在初始化列表中初始設定變數的順序來為變數分配記憶體空間。初始化列表中變數的初始化順序時其在類體內定義的順序。

        同樣得,因為const型成員變數只能在被定義的同時被初始化而不能夠再次被賦值,它也只能被放在建構函式的初始化列表中。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.