2012-12-02 67 views
2

我曾經看到過建議成員函數明確引用使用this->的成員變量,以避免忘記聲明成員變量並意外引用全局變量。任何人都可以發表評論,如果他們認爲這是一個合理的預防措施或不必要的冗長,將無謂地複雜的代碼閱讀?有沒有人真的在日常的現實生活中編程?顯式成員函數中的this->`

+4

IMO,這是一個瘋狂的想法,幾乎可以肯定做傷害了極大的可讀性所有的時間,以確保針對我(一)從來沒有見過一個問題(雖然我只寫了C++爲〜30歲,所以也許我只是沒有看到它*)*)。 –

+1

@JerryCoffin C++第一次出現在'83,所以它很難在它的代碼30年; –

+0

@BartekBanachewicz:Ooops - typo。這應該說「20年」。抱歉。 –

回答

6

由於我經常實現類模板,我習慣總是使用this->限定成員變量和成員函數。在類模板的情況下還有另外一個原因,它與this->資格名稱很有用:不依賴於模板參數名稱僅在相位上查找我查找,即取決於模板參數名在基類從不看在基地。通過使用this->來限定成員名稱,他們變得有依賴性。例如:

#include <iostream> 

void f() { std::cout << "::f()\n"; } 

template <typename T> 
class base 
{ 
public: 
    void f() { std::cout << "base::f()\n"; } 
}; 

template <typename T> 
class derived 
    : public base<T> 
{ 
public: 
    void g() { 
     f(); 
     this->f(); 
    } 
}; 

int main() 
{ 
    derived<int>().g(); 
} 

我使用資格,在我的所有代碼,除非一些編碼規則禁止我這樣做this->(我會考慮的編碼準則愚蠢和錯誤的這一方面)。當然,在我自己的代碼我有資格可以合格,所有的名字都沒有定製點(例如,我就沒有資格swap())。

1

嗯,不,因爲你通常不會使用經常使用的全局變量,因爲這些變量會引起衝突。此外,你可以隨時使用前綴表示成員變量:

class C { 
    int m_Foo; 
    int mBar; 
}; 

使用這個真的可以炸掉的代碼大小和影響可讀性。考慮

class Foo { 
    int a, b, c, d; 

    int Bar() { 
     return (a + b + (b/c) + d * (c + a)); 
    } 
}; 

嘗試在上面的例子中添加this->

此外,每個優秀的編輯器都會根據其範圍對變量着色不同。

+0

哪些編輯器按範圍着色?我正在使用VS2010,但它不這樣做。例如, – baruch

+0

VS 2012。或者你可以得到VisualAssist插件。 –

1

雖然對於成員變量的一些約定是件好事,但我認爲this->太冗長了,並且試圖解決一個難得的機會發生的問題。我使用m_varmVar作爲成員變量。

它讓我想起了這種僞預防措施if (3 == var) insend if (var == 3)避免了if (var = 3)的錯誤。現在的編譯器總是抓住。

可讀代碼計數。它可以防止錯誤。

+0

+1,我總是想知道爲什麼一些老學校的C++編碼器用於寫'if(3 == var)'... –

+0

我試圖用這種方式編寫它,但它只是......不合邏輯的?編譯器還警告這些表達式。 –

+0

現在幾年來,我在這裏和那裏遇到這件事,而且還不習慣。 –

1

this->經常被用來在IDE的

讀取

  • 用於自動完成時,以避免與全局或成員函數

    • 針對碼維護者參數的mixup可以有這些優點也通過與m_
      前綴前綴的成員更簡潔