2011-11-15 60 views
4

可能重複:
When should I make explicit use of the this pointer?C++正確使用,這個指針

我想了解一下的 「this」 指針的正確使用。

我見過有人創建一個類的構造函數,其參數傳入的變量在名爲'data'中傳遞。 但是他有一個私有成員變量命名已經因此他只是用「數據」:

this->data = data;

會工作簡單地使用

(如果該參數被命名爲DATA_IN) ,並且不需要調用「this」指針並引用成員類型。

現在我想知道,這是正確的用法?使用this->member來降低命名複雜度?我的意思是,它的工作原理,我看到它完成了意向,但我想知道如果這是常見的做法,如果你們中有些人更有經驗的C++傢伙和女孩可以說一兩句話?

此外,出於好奇,我已經檢測了代碼,只是爲了看看引擎蓋下發生了什麼,似乎無論如何都會調用「this」指針。我想這就是對類對象的引用完成的方式。

+0

這是一個品味的問題。有些命名方式不同,有些命名爲':data(data)'(如果適用),一些會使用'this-> data',另一些命名爲'classname :: data'。無論你喜歡什麼美學。 –

回答

6

在大多數情況下,特別是取消引用this指針來訪問類實例的非靜態數據成員是不必要的,但它可以幫助指定混淆,特別是當類的數據成員在單獨的代碼模塊頭文件。但是,如果要訪問作爲模板類的基類的成員的非靜態數據成員,則必需以使用this指針。換句話說,在一個情況,如:

template<typename T> 
class base_class 
{ 
    protected: 
     int a; 
}; 

template<typename T> 
class derived_class : public base_class<T> 
{ 
    void function() 
    { 
     a = 5; //this won't work 
     this->a = 5; //this will work 
    } 
}; 

你會注意到,你必須使用this指針,以妥善解決從模板基類繼承的非靜態數據成員。這是因爲base_class<T>::a是一個從屬名稱,在這種情況下取​​決於模板參數T,但在沒有使用this指針的情況下使用時,它被視爲非依賴名稱,因此不在相關依賴項中查找基類命名空間。因此,如果沒有this指針的具體取消引用,最終會出現編譯器錯誤,如「a未在此範圍內聲明」或類似內容。

+0

您的代碼片段「a = 5」沒有「this->」在VisualStudio上編譯。 –

+0

嗯,不是在gcc ...你得到我描述的問題... http://ideone.com/H7DDza – Jason

2

沒有訪問類成員爲:

this->member = something; 

是相同本身訪問成員,

member = something; 

編譯器看到的既是相同,其不涉及任何開銷。即使你使用第二種格式,編譯器也會和第一種格式一樣。

簡而言之,試圖使用兩種格式中的任何一種來提高性能是無用的。當然,您可能必須在某些模板情況下使用第一種格式(訪問模板化基類的非靜態數據成員),但這不是爲了提高性能。

+1

隨着@Jason指出的警告...... –

+0

@OliCharlesworth:當然,這很好,儘管OP詢問Q的主要目的是與性能相關的IMO。 –

0

基本相同,除了傑森指出的。

好的部分是,如果您使用this->大多數編輯器將爲您完成代碼完整,節省您輸入。

0

這是「正確的」,但它也是一個不好的做法。命名參數與類成員相同是一個壞主意。故意創建命名衝突是一個壞主意。

範圍操作符的設計用於命名衝突不可避免時(例如重寫基本成員時),或者當使用兩個獨立選擇標識符名稱的庫時。不要認爲他們做愚蠢的事情是免費的。

除非你正在練習混淆代碼比賽。然後通過一切手段引入命名衝突。