2011-11-15 14 views
4

可能性の重複:
When should I make explicit use of the this pointer?C++適切な使用、このポインタ

私は "この" ポインタの適切な使用法に疑問を抱いています。

私は誰かが名前の「データ」に渡される引数渡された変数を持つクラスのコンストラクタを作成して見てきました。彼は「データ」という名前のプライベートメンバ変数がすでにので、彼は単に使用していたが :

this->data = data;

は単に

を使用するために働いているだろう(パラメータがDATA_INと命名された場合) 、 "this"ポインタを呼び出してメンバ型を参照する必要はありません。

今私は思ったんだけど、この正しい使い方は?名前の複雑さを軽減するためにthis->memberを使用しますか?私はそれが動作を意味し、私はそれが意図されたものを達成していることがわかりますが、これは一般的に行われている場合は、あなたのいくつかのより多くの経験豊富なC++の男と女の子は単語または2を言うことができる場合、私は思ったんだけど?

また、好奇心から、私はちょうどボンネットの下に何が起こるかを見るためにコードをインストルメントしました、そして、「この」ポインタがとにかく呼び出されるようです。私はそれがクラスオブジェクトへの参照がとにかく行われる方法だと思います。 NOとクラスメンバにアクセスする

+0

これは味の問題です。 '' data(data) '(該当する場合)、' this-> data'を使うもの、 'classname :: data'を使うものがあります。あなたの美しさはどんなものでも喜ばれます。 –

答えて

6

ほとんどの場合、具体的には、クラスインスタンスの非静的データメンバーにアクセスするためのポインタの逆参照は不要ですが、特にクラスのデータメンバーがコードモジュールとは別のヘッダファイル。しかし、それあなたがテンプレートクラスで基本クラスのメンバーである非静的データメンバにアクセスしている場合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

"this->"のないコード "a = 5"のスニペットをVisualStudioでコンパイルします。 –

+0

うーん、gccではない...あなたは私が説明した問題を... http://ideone.com/H7DDza – Jason

2

this->member = something; 

member = something; 

、それ自体でメンバーへのアクセスと同じであるコンパイラは、どちらも同じよう見て、何のオーバーヘッド関与は、彼らではありません。 2番目のフォーマットを使用しても、コンパイラは最初のフォーマットと同じように動作します。要するに

、パフォーマンスの向上を目的とした2つの形式のいずれかを使用しようとすることは無用です。もちろん、いくつかのテンプレートケース(テンプレートベースクラスの非静的データメンバーにアクセスする)では最初のフォーマットを使用する必要があるかもしれませんが、それはパフォーマンスのためではありません。

+1

@ Jasonが指摘している注意点で... –

+0

@OliCharlesworth:Ofcourse、Qを尋ねるOPの主な目的はパフォーマンス関連のIMOでしたが、 –

0

Jasonが指摘していることを除いて、本質的に同一です。

良い点は、this->を使用すると、ほとんどのエディタが完全にコードを作成して、入力を省くことです。

0

「正しい」とは言えますが、それは練習にもなりません。クラスメンバと同じ命名パラメータは悪い考えです。名前の競合を意図的に作成することは悪い考えです。

スコープ演算子は、ベースメンバをオーバーライドする場合や、識別子名を独立に選択した2つのライブラリを使用する場合など、命名の競合が避けられない場合に使用します。それらを愚かなことをするための無料ライセンスとはみなさないでください。

難読化されたコードコンテストで練習している場合を除きます。次に、名前の衝突を紹介します。