2010-02-02 127 views
3

我有一個容納一些[public]數據的簡單對象。C++中相同的類成員名稱和函數參數名稱

我想讓我的界面保持清潔,所以我不想預先/後期修復任何可公開訪問的變量的名稱或我的函數參數的名稱。

這麼說,我結束了做這樣的事情:

template<typename T> struct Foo 
{ 
    explicit Foo(T x) : x(x) // This [i.e., x(x)] seems to be doing the "Right Thing", but is this well defined? 
    {/*   ^
     No pre-/post- fixing. 
    */ 
    } 

    T x; // No pre-/post- fixing. 
}; 

只是重申:所有我問的是是否這是有規定的行爲。不是我應該或不應該這樣做...

謝謝。

+0

同一個問題在一天前被問到;對不起,我沒有鏈接。答案似乎是,是的,這是明確的。 – 2010-02-02 03:44:50

+0

謝謝,我想我錯過了我的搜索。那麼我會接受Poita_的答案。 – eciDive 2010-02-02 03:48:53

+0

我不會使用,因爲你必須問這個問題。事實上,閱讀意味着一名維護人員會在一年內出現,並說乾草看起來不會寫,要麼修復它,要麼花費一筆數據以確保它能正常工作。一個simpel規則不寫代碼,要求你必須問一個有關天氣的問題。 – 2010-02-02 06:58:46

回答

6

是的,這很好,並且完全標準。

局部變量總是在名稱查找中排在第一位,但初始化列表中的x(...)顯然只能指向成員變量[edit:或基類]。

如果你沒有使用初始化列表,你會寫:

explicit Foo(T x) 
{ 
    this->x = x; 
} 
+0

Whooooo。那不一樣。在這裏,您使用賦值運算符進行默認構造。這絕對不是理想的,特別是對T來說並不簡單。 – 2010-02-02 06:56:19

+0

從實際執行的角度來看,它是不一樣的,但它是如何執行名稱查找的一個很好的例子:在構造函數體內局部變量隱藏成員,因此成員必須是完全限定的,而在初始化列表中,初始化(缺少一個更好的名稱)名稱必須是當前類的子對象,並且不需要明確指出。我總是發現在x(x)中第一個和第二個x的解析方式是不同的,即使它是完全有意義的。 – 2010-02-02 08:27:57

1

具體的構造函數的初始化列表,這是良好定義的行爲 - 因爲你只能初始化一個成員或基類,其中之一與參數名稱之間不存在歧義。

但是,在幾乎任何其他情況下,您都會產生歧義。特別是,你的標題只是指「功能」 - 除了ctor以外的任何其他功能,這將不起作用。即使在ctor的內部,它也不起作用 - 「特殊」處理純粹在ctor的初始化列表中。

+0

謝謝,我知道含糊不清和需要「this - >」 - 訪問。經過反思,我想我應該想出一個更好的標題。 ;) – eciDive 2010-02-02 03:56:50

相關問題