看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《FAITHY ()》之銘言: : 請問 : class A : { : public: : A(int){}; : private: : int i; : } : A::A(int x):i(x) : {} : 和 : A::A(int x) : { : i=x; : } : 差在哪~ : 本來看effective c++ : 因為後者 做完一次construct後再做assign的動作? : ...自己想法是在A做construct前會做變數i的construct?(不過似乎不是這樣) 沒錯 : 然後又書中提到當 : class A : { : public: : A(int){}; : private: : int i; : int i2; : int i3; : int i4; : int i5; : } : 最好寫做 : A::A(int x) : { : i=i2=i3=i4=i5=x; : } : 而非 : A::A(int x):i(x),i2(x),i3(x),i4(x),i5(x) : {} : 請問是為何原故嗎 : 因為書上有點看不懂... : 感謝m(_ _)m 首當其衝會影響到的是 code 的長度, 當你有 10 個成員, 寫成 這樣會變得非常雜亂, 效率倒還不是問題, 用指標成員就可以搞 定. 另外還有一個考量, 使用 initializer list 初始化成員的時候 , 寫的順序必須和成員出現在 class specifier的順序一致, 舉 個例子來說: class Array { private: int *v; private: size_t size; public: Array( size_t theSize ) : size( theSize ), v( new int[ size ] ) { ... } }; 撰寫的人如果忘記了這規則, 可能 bug 找好久都找不出來. 再回到原 po 這個問題, 如果我這樣寫呢? A::A(int x) : i5(x), i4(i5), i3(i4), i2(i3), i1(i2) {} 多個成員初始值都一樣時, 這種易錯的程式碼很容易出現, 為了 避免其發生, 用 assign 來代替copy, 賦值的順序會比較明顯, 不必受制於前面提到的規則: A::A(int x) { i1 = i2 = i3 = i4 = i5 = x; } -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢██ 歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████花英 ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115
legnaleurc:印象中好一點的 compiler 會給 warning 03/11 03:10
legnaleurc:不過 C++ 的隱藏規則實在太多, 而且有的很要命 03/11 03:11
VictorTom:(招手)C++是很恐怖地, 趕快回來C語言這裡吧....(大誤XD) 03/12 16:02
Bencrie: (招手)C++是很恐怖地, 趕快回來C語言這裡吧....(大誤XD) 03/12 18:28
FAITHY:感謝大大的指導 謝謝:) 03/12 19:06