2009-10-22 10 views
6

質問は簡単です... 何らかの理由でthis-> yourvariableまたはyourvariableを直接使用することに違いはありますか?クラス内の "this"ポインタ

私は何の問題も発見していませんが、これを使用しています。さらに進める前に違いがあるかどうかを知りたいと思います。

私はここの記事にコメントを見ましたが、どのスレッドが覚えていないのですが、この人はキーワード "this"を使用することについて何か言っていました。

個人的には、変数よりも直接使用するのが楽しいです。それはコードをより簡単で美しくします。

ジョー

+2

参照:http://stackoverflow.com/questions/993352/when-should-i-make-explicit-use-of-this-pointer –

+0

コーディングのガイドライン私が読んだコーディングガイドラインは、 。意味を持たないのはコードノイズです。あなたのコードを読んでいる人は、あなたがクラスメンバを使っているという文脈から推測できるはずです。 – dss539

+0

'this'を使うと、明示的にプログラムを読みやすくすることができます。 – Xinus

答えて

12

ありませんが、それは単にスコープ修飾子で、本当の違いはありません。しかし、方法を仮定してください

void SetFoo(Foo foo) 
{ 
    this->foo = foo; 
} 

ここでthis-> fooは私的なメンバーです。ここでは、クラス/インスタンス変数と同じ名前のパラメータを取ることができます。

0

これはC#hereについて尋ねられ、答えられました。私は答えは(少なくとも私のもの)は同じだと思います。それは好みです。

1

thisを使用すると、自分のコードを読みやすくすることができますが、その必要はありません。コンパイラが生成するアセンブラコードを見ると、機能上(通常は文字通り)同一でなければなりません。

基本的には、関数が呼び出されると隠し引数thisが渡され、次にどの変数がどこにあるのかがわかります。 this->なしで直接変数を使用する場合は、構文的な砂糖を使用する以外は何もしません。

16

ほとんどの場合、違いはありません。あなたはとてもその名前の検索が遅れているthis->でメンバーを修飾する必要があるかもしれませんテンプレートでも

class foo 
{ 
    int i; 
    void bar() { 
     int i = 3; 
     i; // refers to local i 
     this->i; // refers to the member i 
    } 
}; 

、::

template<typename T> 
struct A 
{ 
    int i; 
    T* p; 
}; 

template<typename T> 
struct B : A<T> 
{ 
    void foo() { 
     int k = this->i; // here this-> is required 
    } 
}; 

正しくないコンパイラをしかし、それは違いを作る状況があります"two-phase lookup"は、あなたが何を想定しているのかわからない "this->"を削除した場合に不平を言うでしょう。 "this->"は、それが基本クラスのメンバーであることを示します。基本クラスはテンプレートパラメータに依存するため、クラステンプレートがインスタンス化されるまでルックアップは遅延されます。

+0

+1テンプレートの問題を通知します。 gccは、通常、 ''の行に沿ったものはテンプレートパラメータに依存しないため、定義が利用可能でなければならないと言います。 –

関連する問題