Re: [問題] Class初始化的順序?!

看板C_and_CPP作者 (毅)時間14年前 (2010/06/21 12:47), 編輯推噓2(2016)
留言18則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《vitolee (毅)》之銘言: : 我碰到一個有趣的問題,想請問大家是否有碰過。 : 其實我不太明白為啥會有這問題,想請問大家看看 : Code 如下: : class base{ : private: : int m_i; : int m_j; : public: : base( int i):m_j(i),m_i(m_j){} : base():m_j(0),m_i(m_j){} : int get_i(){return m_i;}; : int get_j(){return m_j;}; : }; : int main(int argc, char *argv[]){ : base obj(98); : obj.get_i(); : obj.get_j(); : return 0; : } : 今天我把private中的 int m_i 跟 int m_j 順序對調 : 哪印出來的結果是不同的? : 查了一下~應該是初始化的順序問題, : 但還是不太明白,想請問大家看看~是否有碰過這問題呢! : 謝謝! 所以說,今天我呼叫 obj(98) 會base(int i)執行下 m_i=m_j中造成 m_j尚未初始化? 之後執行m_j=i 產生 m_i為亂數,但是m_j的值為98. 今天若把 int m_j先宣告,在宣告int m_i 產生 m_j 與 m_i 的值皆為98呢? 因為看來還是會先執行 m_i=m_j 在執行 m_j = i 不太明白程式怎麼跑的說 XD" 還是說我的觀念有點錯誤? 感謝大家的回應說! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.60.223.174

06/21 13:37, , 1F
Step 1. m_i 以 m_j 為初值, 但 m_j 未定義(某垃圾值)
06/21 13:37, 1F

06/21 13:37, , 2F
所以 m_i 也是垃圾值, 除非你真的在寫 RNG XDDDDrz
06/21 13:37, 2F

06/21 13:38, , 3F
Step 2. m_j = i 就是正確的
06/21 13:38, 3F

06/21 13:38, , 4F
-------------------------------------------------------
06/21 13:38, 4F

06/21 13:39, , 5F
Step 1. m_j = i
06/21 13:39, 5F

06/21 13:39, , 6F
Step 2. m_i = m_j
06/21 13:39, 6F

06/21 13:40, , 7F
J大已經有說啦. 你的 compiler 都沒有抱怨? XDrz
06/21 13:40, 7F

06/21 14:40, , 8F
我是用Dev-C++!基本上兩種compiler都給過
06/21 14:40, 8F

06/21 14:42, , 9F
warning 不是 error, 當然要過 XDrz
06/21 14:42, 9F

06/21 14:42, , 10F
所以在先宣告m_j的話,將會先執行m_j=i而不是m_i=m_j羅!
06/21 14:42, 10F

06/21 14:43, , 11F
也沒有Wrongㄟ >.<a" 都給過XD"
06/21 14:43, 11F

06/21 14:43, , 12F
此外也有很多種 warnings, 很有趣低
06/21 14:43, 12F

06/21 14:43, , 13F
沒錯 重點是宣告順序 而不是建構子後面那串的順序
06/21 14:43, 13F

06/21 14:44, , 14F
跟 constructor initialization list 順序無關
06/21 14:44, 14F

06/21 14:45, , 15F
Member variables are always initialized in the order
06/21 14:45, 15F

06/21 14:45, , 16F
they are declared in the class definition
06/21 14:45, 16F

06/21 14:46, , 17F
原來如此~~呵! 突然腦袋好像懂了XD" 所以基本上是宣告順序
06/21 14:46, 17F

06/21 14:46, , 18F
感謝兩位ㄟ~~
06/21 14:46, 18F
文章代碼(AID): #1C7kxDXj (C_and_CPP)
文章代碼(AID): #1C7kxDXj (C_and_CPP)