2011-01-30 99 views
7

以下代碼可以在我的機器上運行,但這是否是良好的做法/保證能夠正常工作?C++:初始化列表/命名約定

struct MyStruct { 
    MyStruct(int x, int y, int z) : 
     x(x), 
     y(y), 
     z(z) { 
    } 

    int x; 
    int y; 
    int z; 
}; 

具體來說,是x(x)保證做我想要的嗎? (也就是說,它在初始化列表中的變量總是看那個結構/類的成員?)

我不想用開頭或結尾下劃線因爲x是結構的公共成員。

謝謝!

+0

儘管編譯器做的是正確的事情,但任何查看代碼的人都會感到困惑。如果這種類型比您所展示的更復雜,並且您爲此添加了十年和三代程序員維護,它幾乎肯定會變得一團糟。 – sbi 2011-01-30 18:30:09

回答

11

是的,這是保證你的期望。

,可以存在「外」括號中的初始化列表的唯一的事情是成員變量。在括號內,通常的規則適用;局部變量隱藏成員變量。

至於是否是很好的做法,那麼,考慮一下,如果你不小心刪除從構造函數參數列表中的一個或多個參數會發生什麼。該代碼仍然會編譯好!但它會在運行時發生可怕的破裂。不過,我仍然經常使用這種模式。

0

是,X(X)不正是你想要的。 X(x)是所述部件的名稱,和x(X)是形式參數。

2

雖然希望你做什麼,想象這種情況推而廣之:

class MyStruct { 
public: 
    MyStruct(int x, int y, int z) 
    : x(x), 
     y(y), 
     z(z) 
    { } 
    int x() const; 
    int y() const; 
    int z() const; 

private: 
    int x; 
    int y; 
    int z; 
}; 

這將無法正常工作。這就是爲什麼我用我的班級成員加上m_。這允許非常可讀的代碼向讀者提示所討論的標識符是類的一部分。非前綴標識符是函數參數(如在構造函數初始化程序列表中:m_x(x)或函數局部變量)。