2013-10-18 104 views
3

這是我做的事情相當普遍,當我編寫C++,我一直在琢磨,如果它是一個「壞」習慣一段時間(這種行爲是標準的嗎?)命名功能參數同級成員

可以說,我有一個類:

Class Foo { 
    public: 
    Foo(int x) { 
     //this->x is the member "x" of Foo 
     //x is the paramater "x" to the function 
     this->x = x; //Sets Foo::x to x (parameter x) 
    } 

    private: 
    int x; 


}; 

請注意,在Foo::Foo(int x),該參數被命名爲x這是相同的名稱作爲Foo一個成員變量。

我通常只是使用use this->x = x;來分配成員變量的參數值,這似乎對我(我通常使用MSVC)的工作。在MSVC(和我認爲的GCC)中,訪問x將訪問名爲x而不是名爲x成員。這是所有C++編譯器的標準化行爲嗎?是否有任何東西阻止編譯器將x與成員變量而不是參數變量相關聯? (例如:this->x;將相當於this->x = this->x;

+1

您應該使用初始化程序列表,而不是進行分配。使用初始化程序列表,您只需初始化成員x。在你當前的代碼中x被初始化,然後參數x被分配給它,本質上你正在做2x工作。 –

回答

5

是,使用任何兼容的編譯器,該參數x將隱藏構件x。但是更有趣的你寫的另一種方法是這樣的:

class Foo { 
public: 
    Foo(int x) : x(x) {} 
private: 
    int x; 
}; 

其中,除了是不可讀的,會怎麼做正是你希望它是什麼。

5

我同意Rob的說法,任何符合標準的編譯器都會讓你做你正在做的事,但你的代碼很難閱讀。

命名約定非常重要。選擇一個命名約定,不要在同一個程序中改變它。 http://geosoft.no/development/cppstyle.html 這是最常見的命名約定的列表,每一個都包括爲什麼選擇特定的命名約定一個簡短的聲明:

我在C++編程時使用本指南。複製此列表並根據您的喜好進行自定義。

項目#11(根據命名約定)直接解決您的問題,併爲您提供更好的選擇。

+2

+1,對於優秀的建議,儘管這不能回答他的問題。他沒有問「我該怎麼辦?」,他問「編譯器做了什麼?」我想他已經知道他不應該這樣做。 –

+0

不,他首先問道:「......這是一個壞習慣。」他的帖子其實有三個問題。你覆蓋了其他人。 –

+1

@JasonEnochs我相信OP意味着如果行爲不是標準,這可能是一個壞習慣,而不是它可能是一個壞習慣,因爲它不是一個好的風格。但是我可以看到它很容易解釋,所以你的答案是值得的。 – JBentley

0

雖然初始化程序列表可能是規範方法,但分配發生的順序不在您的控制之下。但簡單地將​​或'_'預先添加到您的成員是一種使用的方法。另一種方法是採用約定將'_'添加到您的參數中(如果您喜歡更清晰的成員變量聲明)。像這樣,

class Foo { 
public: 
    Foo(int _x) : x(_x), y(0) {} 
    Foo(int _x,int_y) { x=_x; y=_y; } 
private: 
    int x, y; 
}; 

使用這也是有效的。