開發Qt碰到的第一個問題(when initialized here)

最近在寫一個qt程序,碰到了一個warning,雖然明白怎麼避免 2 但是開始不明白爲什麼要報這個warning 3 4 //程序抽象一下,如下 5 //test.cpp 6 #include 7 using namespace std; 8 9 class A 10 { 11 int m_a; 12 int m_b; 13 public: 14 A():m_b(0), m_a(0) {} 15 }; 16 17 18 int main() 19 { 20 return 0; 21 } 22 23 //編譯 24 g++ -g -Wall -o test test.cpp 25 26 //你就會發現一個Warning 27 E:/source/test>make 28 g++ -g -Wall -o test test.cpp 29 test.cpp: In constructor `A::A()': 30 test.cpp:7: warning: `A::m_b' will be initialized after 31 test.cpp:6: warning: `int A::m_a' 32 test.cpp:9: warning: when initialized here 33 34 也就是說初始化順序跟變量申明順序有問題, 35 但事實上爲什麼會報這個warning? 36 或者說,編譯器認爲,m_a申明在m_b之前, 37 但是m_b比m_a先初始化,到底會帶來怎樣意想不到的結果 38 39 這個就要追溯到,c++的initialization list機制 40 A():m_b(0), m_a(0){} 41 這個初始化,到底是怎麼實現的 42 其實c++會在這個構造函數裏面加入他們的初始化代碼 43 於是這個構造函數等價與 44 A() { 45 m_a = 0; 46 m_b = 0; 47 ////上面是用戶不可見,c++自己生成部分 48 ..... // 這些是用戶添加的代碼 49 } 50 你現在已經驚奇的發現,雖然 51 A():m_b(0), m_a(0); 52 m_b的初始化在m_a前面,但是m_a確先初始化 53 理由只有一個,這個編譯器自動添加代碼的順序 54 是按照類成員的申明順序添加的!!!!!! 55 56 57 //我們寫個簡單的程序測試一下 58 59 #include 60 using namespace std; 61 62 class A 63 { 64 int m_a; 65 int m_b; 66 public: 67 A():m_b(-1), m_a(m_b) {} 68 void print() { cout<<"m_a = "<

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