2014-06-26 55 views
5

假設我有以下類:如果你不在課堂上使用「this」會發生什麼?

class foo{ 
public: 
     int someNum; 
     void calculation(int someNum); 

}; 

定義:

void foo::calculation(int someNum){ 
     someNum = someNum; 
} 

現在在該行someNum = someNum,這someNum被提及? 如果我這樣做:

this->someNum = someNum 

那麼第二個someNum是什麼?

什麼是良好的命名風格,以避免這個問題?例如,在objective-c中,在成員變量名稱前加「_」。 (例如_someNum);

回答

9

內一個成員函數參數名隱藏相同類成員的名字,所以在

void foo::calculation(int someNum){ 
     someNum = someNum; 
} 

兩個someNum s的參考參數。這是一個自我分配,不會改變this->someNum

this->someNum = someNum;中,第二個someNum指的是函數參數。因此,它將函數參數someNum的值分配給類成員someNum

通用命名約定包括mm_前綴或類別成員的後綴_。前綴下劃線可能會有問題,因爲C++保留以下劃線開頭且後跟大寫字母的名稱。


注意,在構造函數成員初始化列表是一種特殊情況:

foo(int someNum) : someNum(someNum) { someNum = someNum; } 
       ^ ^  ^  ^
        |  |   |   | 
        |  ---------------------- 
        |  These three all refer to the parameter 'someNum', 
        |  and not the class member. 
        | 
    The language requires this name to be referring 
    to a class member (or a base class) and so the 
    parameter called 'someNum' is not considered. 
+5

值得注意的是,這條規則並不適用於構造函數的成員初始化列表。 'foo(int someNum):someNum(someNum){}'做正確的事情。 – sbabbi

+0

@sbabbi謝謝,補充。 –

1

在最裏面的作用域中聲明的變量會影響外部作用域中的變量。因此,someNum = someNum'foo::calculation對成員變量someNum沒有影響。相反,someNum是指傳入的參數。爲了幫助緩解這一點,命名標準建議在成員變量前加一個一致的標識符 - 例如「m_」。

相關問題