2013-05-11 7 views
7

私はC++にかなり新たなんだ、と私はthisポインタが次のシナリオで何をするか理解していない:私はここに誰か他の人のポストからということをつかん'this'ポインタとは何ですか?

void do_something_to_a_foo(Foo *foo_instance); 


void Foo::DoSomething() 
{ 
    do_something_to_a_foo(this); 
} 

thisにはどのような機能がありますか?よくわかりません。関数には入力がないので、thisは何をしていますか?

+0

すべての非静的メソッドには暗黙の 'this'ポインタがあります。典型的なC++実装では、最初の整数引数スロットに渡されます。 –

+0

私はこのようなことを避けるでしょう - "fooに何かをする"関数はおそらくFooのメンバ関数/メソッドでなければなりません! –

+0

@Wayne Uroda:必ずしもそうではありません。 –

答えて

24

は、現在のオブジェクトを指します。

キーワードthisは、特殊なタイプのポインタを識別します。 xというオブジェクトをclass Aclass Aというオブジェクトを非スタティックメンバー関数f()に作成したとします。関数x.f()を呼び出すと、f()の本文にあるキーワードthisには、xのアドレスが格納されます。

+0

ありがとう!あなたの答えは私には大変な意味があります。それはまさに私が知りたかったものです。 – user2371809

+0

あなたは大歓迎です:) –

2

このは、自己(を呼び出すオブジェクト)へのポインタです。

静的メソッドgetColor()を持たないcarという名前のcarクラスのオブジェクトがあるとします。この内部のgetColor()を呼び出すと、car(クラスのインスタンス)のアドレスが返されます。

スタティックメンバ関数にはポインタがありません(インスタンスには関係しないため)。

6

短い答えは、thisが "this"オブジェクト(あなたが現在操作しているオブジェクト)を特定する特別なキーワードです。

classの場合、staticと非staticの2種類のメンバー関数を持つことができます。非staticメンバー関数は、クラスの特定のインスタンスで動作しなければならず、そのインスタンスがどこにあるかを知る必要があります。それらを助けるために、言語は暗黙の変数を定義します(何もしなくても必要なとき自動的に宣言される変数)。これはthisと呼ばれ、自動的にクラスの特定のインスタンスを指すようになりますメンバ関数が動作しています。あなたがこれをコンパイルして実行するとthisの値がa1a2の間で異なっていることを確認し、

#include <iostream> 

class A 
{ 
public: 
    A() 
    { 
     std::cout << "A::A: constructed at " << this << std::endl; 
    } 

    void SayHello() 
    { 
     std::cout << "Hi! I am the instance of A at " << this << std::endl; 
    } 
}; 

int main(int, char **) 
{ 
    A a1; 
    A a2; 

    a1.SayHello();   
    a2.SayHello(); 

    return 0; 
} 

は、この単純な例を考えてみましょう。

2

これはDoSomething()が呼び出されるFooのオブジェクトを意味します。私はdoSomethingのを呼び出すに印刷されます例

void do_something_to_a_foo(Foo *foo_instance){ 
    foo_instance->printFoo(); 
} 

class Foo{ 
    string fooName; 
    public: 
     Foo(string fName); 
     void printFoo(); 
     void DoSomething(); 
}; 

Foo::Foo(string fName){ 
    fooName = fName; 
} 
void Foo::printFoo(){ 
     cout<<"the fooName is: "<<fooName<<endl; 
} 
void Foo::DoSomething(){ 
    do_something_to_a_foo(this); 
} 

は今、私たちは、文字列をFooのコンストラクタに渡されるものは何でも、同様

Foo fooObject("first); 
f.DoSomething();//it will prints out first 

のようにオブジェクトをインスタンス化私たちのクラスでそれを説明します()。
上記の例のDoSomething()では、 "this"はfooObjectを意味し、do_something_to_a_foo()ではfooObjectが参照渡しされるためです。

1

Foo::DoSomethingなどの非スタティックメンバ関数は、thisに値が使用される暗黙のパラメータを持ちます。標準はこの中に指定C++ 11§5.2.2/ 4:関数が呼び出されると

、各パラメータ(8.3.5)は、その対応する引数で(8.5、12.8、12.1)を初期化しなければなりません。 [Note:このような初期化は、互いに不確定に順序付けられている(1.9) - 終了ノート]関数が非静的メンバー関数である場合、関数(9.3.2)のthisパラメータは、明示的な型変換(5.4)によって変換されたものと同じように変換されます。

結果としてDoSomethingに電話するには、Fooオブジェクトが必要です。そのオブジェクトは単にthisになります。

thisキーワードと通常、明示的に宣言constポインタパラメータの唯一の違いは、(と、それは些細だ)あなたがthisのアドレスを取ることができないということです。

3

だけthisについてのいくつかのランダムな事実は、他の回答を補完します

class Foo { 
public: 
    Foo * foo() { return this; } 
    const Foo * cfoo() const { return this; /* return foo(); is an error */ } 
}; 

Foo x;  // can call either x.foo() or x.cfoo() 
const Foo y; // can only call x.cfoo() 

オブジェクトがconstで、thisの種類はconstへのポインタになります。


class Bar { 
    int x; 
    int y; 
public: 
    Bar() : x(1), y(2) {} 
    void bar (int x = 3) { 
     int y = 4; 
     std::cout << "x: " << x << std::endl; 
     std::cout << "this->x: " << this->x << std::endl; 
     std::cout << "y: " << y << std::endl; 
     std::cout << "this->y: " << this->y << std::endl; 
    } 
}; 
this

ポインタは、関数パラメータまたはローカル変数の陰に隠れたメンバにアクセスするために使用することができます。


template <unsigned V> 
class Foo { 
    unsigned v; 
public: 
    Foo() : v(V) { std::cout << "<" << v << ">" << " this: " << this << std::endl; } 
}; 

class Bar : public Foo<1>, public Foo<2>, public Foo<3> { 
public: 
    Bar() { std::cout << "Bar this: " << this << std::endl; } 
}; 

多重継承は異なる親が異なるthis値を持つことになります。最初に継承された親だけが派生オブジェクトと同じthis値を持ちます。

0

これは、ローカルpointer.Itが

1

Accのローカルオブジェクトとして現在のオブジェクトを参照します。 Balaguruswamy

this

によってのC++とオブジェクト指向プログラミングすることがthis関数が呼び出されたのオブジェクトを指すポインタです。たとえば、関数呼び出しA.max()は、ポインタthisをオブジェクトのアドレスに設定します。ポインタthisは、すべてのメンバ関数の暗黙の引数として機能します。

ここにはthisという素晴らしい例があります。それはまた、私がそのコンセプトを理解するのを助けました。 http://www.learncpp.com/cpp-tutorial/8-8-the-hidden-this-pointer/

0

ポインタはプログラミング言語オブジェクトであり、その値は、そのメモリアドレスを使用してコンピュータメモリ内の他の場所に格納された別の値を指しています。

ポインタは、メモリアドレスをその値として保持する変数であるとも言えます。

+3

この回答は、OPの質問で言及された 'this'部分には対処していません。 – sjaustirni

関連する問題