2011-11-28 57 views
4

什麼是this自引用類的正確用法?正確使用this->

我有時在一個方法中使用它來清除所使用的變量是一個成員變量,而不是在方法中聲明的變量,但另一方面,我想知道這是否是一個很好的理由,因爲我認爲你應該總是以自我解釋的方式編碼(和評論),因此會不必要地使用this,另一個原因是你實際上生產的代碼比需要的多。

void function() { 
    while(i != this->length) //length is member var 
    /*do something*/ 
} 

使用它,我經常遇到的另一種方式是內部構造(主要是在Java中),作爲參數確實有相同的名稱,其中有成員變量初始化。由於Primer指出這是不好的代碼,我不這樣做,但另一方面,我看到如何使用與member-vars相同的名稱作爲參數名稱清除它們的用途。

C++ 
Constructor::Constructor(int size,int value) : this->size(size), 
               this->value(value) {}; 

Java 
Constructor(int size,int value) { 
    this->size = size; 
    this->value = value; 
} 

我希望居然沒有考慮到這兩種語言(Java/C++)的規則,如果沒有,我會重新標記只是C++的,因爲這是我比較感興趣的一個。

+0

另一個用途是相對於嵌套類。可以有多個「這個」。 – emory

+0

風格的Java構造函數:this.a = a;通常被認爲是正確的 –

+2

我知道我看過這個問題之前問過幾十次,有些人收到了很好的答案。 –

回答

10

大多數情況下,this->是多餘的。例外情況是,如果您有一個參數或同名的局部變量(很容易,也許最好避免),或者在一個模板中,爲了強制在後面的使用中依賴於以下符號—,它通常是不可避免的。

+1

+1在第二種情況下,沒有'this->'是不能做的。 –

+0

你能發表一個模板情況的微示例嗎?我認爲這很有啓發性。 –

+0

@KerrekSB:[There](http://stackoverflow.com/questions/8299874/use-of-in-a-template-in-order-to-force-the-following-symbol-to-be-dependent)你走! –

1

使用this->明確規定你指的是一個成員方法/變量。評論說,這僅僅是多餘的......除非出於某種原因,你有一個局部變量一個成員變量具有相同的名稱,並在同一個代碼塊不同的操作他們,例如:

int x = 7; 
this->x = 8; // yes, I really mean the member variable here 
+0

但不會使用相同的名稱兩次已經被認爲是不好的編碼? – Sim

+0

不好的做法,但不錯的編碼。編譯器知道你在談論哪個變量,因爲'x'和'this-> x'是兩個完全不同的變量。 –

+0

@Sim通常是這樣做是一個壞名字的跡象。但是有一些模式,例如Java構造函數,這被認爲是正常的。 –

0

我個人更喜歡用一種方式命名我的變量,以便我看到它們是實例變量,例如m_foo。我只用this->如果編譯器需要我,由於一些不確定性,因爲我發現代碼變得有點難以與具有大量this->在其中表達閱讀

+0

IMO,m_和這個一樣臭 - > – Pubby

2

this在這裏沒有必要,因爲只有會員可以在初始化列表:

Constructor::Constructor(int size,int value) : size(size), // no need for this-> 
              value(value) {}; 

唯一的其他用途this->爲模板。

template <class T> 
struct foo : T { 
    void bar() { 
    this->x = 5; // T has a member named x 
    } 
}; 

如果你不必使用它,那麼不要。除了構造函數和set方法之外,避免使用與成員名稱相同的函數參數。

1

使用this->會增加程序的長度,因此會增加讀取它的認知開銷。它唯一合理的用途是當範圍內存在某些影響班級成員的內容並且想要訪問該成員時。在大多數情況下,隱藏標識符是一個壞主意,並且gcc中有一個編譯器開關(-Wshadow),有助於避免它。

+0

*使用this->增加了程序的長度,所以它增加了閱讀它的認知開銷。*什麼?你能解釋那部分嗎? – Praetorian

+1

是的(也許我沒有使用正確的詞?英語不是我的第一語言)。我的意思是,當某人(或者甚至是自己)讀取你的程序時,如果你把這個地方放到每個地方,他們都必須閱讀和理解更多的代碼。特別是對於突出顯示的關鍵字,它比起它不在那裏佔據了更多理解代碼的思維過程。這對一個實例來說並不重要,但它會增加。換句話說,更多的代碼可能會導致增加[WTFs/min](http://www.osnews.com/story/19266/WTFs_m)。 –

+0

+1爲wtfs/min,從來沒有聽說過它,但只要我看到它就愛它 – Sim

1

在構造函數中使用this不是必需的:編譯器足夠聰明,可以從成員名稱中告知參數名稱。下面編譯代碼段和運行良好:

Constructor::Constructor(int size,int value) : size(size), value(value) {}; 

在一般情況下,用於消歧的利用this是有效的,但不必要的:爲你正確地指出,你可以簡單地使用不同的名稱參數和成員,就是這樣。但是,有些情況下您必須使用this,否則事情不會編譯。這裏是一個略微人爲的例子 - 使用this建立「回參考」,如下所示:

class Callback { 
    Client *client; 
public: 
    Callback(Client* client) : client(client) {} 
    // ... 
} 

class Client { 
    Callback callback; 
public: 
    Client() : callback(this) {} // You must use 'this' here 
    // ... 
}