天天看點

成員初始化清單

什麼時候使用初始化清單

在構造函數中對于對象成員的初始化發生在初始化隊列中——或者我們可以把初始化隊列直接看做是對成員的定義,而構造函數體中進行的則是指派操作。是以不難了解有四種情況必須用到初始化清單:

  • 當初始化一個引用成員的時候
  • 當初始化一個const成員的時候
  • 成員對象沒有預設構造函數
  • 基類對象沒有預設構造函數

前兩者因為要求定義時初始化,是以必須明确的在初始化隊列中給它們提供初值。後兩者因為不提供預設構造函數,所有必須顯示的調用它們的帶參構造函數來定義即初始化它們。

顯而易見的是當類中含有對象成員或者繼承自基類的時候,在初始化隊列中初始化成員對象和基類子對象會在效率上得到提升——省去了一些指派操作嘛

初始化隊列的初始化順序與在隊列的順序無關,而與成員在類中聲明的順序有關。

是否可以使用memset來初始化一個對象,使用memcpy來拷貝一個對象?

隻有在class不含任何編譯器産生的内部members時是可以有效使用,如果一個class聲明一個或一個以上的virtual functions,或内含一個virtual base class,那麼使用上述函數會使那些“被編譯器産生的内部members”的初值被改寫。