C++类构造函数初始化列表及初始化成员变量的误区
構造函數初始化列表以一個冒號開始,接著是以逗號分隔的數據成員列表,每個數據成員后面跟一個放在括號中的初始化式。例如:
[cpp]?view plaincopy上面的例子中兩個構造函數的結果是一樣的。上面的構造函數(使用初始化列表的構造函數)顯式的初始化類的成員;
而沒使用初始化列表的構造函數是對類的成員賦值,并沒有進行顯式的初始化。
初始化和賦值對內置類型的成員沒有什么大的區別,像上面的任一個構造函數都可以。對非內置類型成員變量,為了避免兩次構造,推薦使用類構造函數初始化列表。
但有的時候必須用帶有初始化列表的構造函數:
1.成員類型是沒有默認構造函數的類。若沒有提供顯示初始化式,則編譯器隱式使用成員類型的默認構造函數,若類沒有默認構造函數,則編譯器嘗試使用默認構造函數將會失敗。
2.const成員或引用類型的成員。因為const對象或引用類型只能初始化,不能對他們賦值。 或者改為static。
【常量必須在構造函數的初始化列表里面初始化 或 設置成static】
例子:
class A {const int size = 0;//錯誤 }class A {A(){ const int size = 9; } }或者 class A {static const int size = 9; }初始化列表的成員初始化順序:
C++初始化類成員時,是按照聲明的順序初始化的,而不是按照出現在初始化列表中的順序。跟初始化列表的順序無關
Example:
但是編譯器先初始化m_x,然后是m_y,,因為它們是按這樣的順序聲明的。結果是m_x將有一個不可預測的值。
有兩種方法避免它,一個是總是按照你希望它們被初始化的順序聲明成員,第二個是,如果你決定使用初始化列表,總是按照它們聲明的順序羅列這些成員。這將有助于消除混淆。
總結
以上是生活随笔為你收集整理的C++类构造函数初始化列表及初始化成员变量的误区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 变位齿轮重合度计算公式_齿轮变位系数的优
- 下一篇: 支付宝集成