作者loveme00835 (朴髮箍)
看板C_and_CPP
標題Re: [問題] 關於物件內部變數的給值
時間Fri Mar 11 02:56:24 2011
※ 引述《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