web-dev-qa-db-ja.com

「これ」ポインターとは何ですか?

私はC++にかなり慣れていないので、次のシナリオでthisポインターが何をするのか理解できません。

void do_something_to_a_foo(Foo *foo_instance);


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

私はここに他の誰かの投稿からそれをつかみました。

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

15
user2371809

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

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

32
TelKitty

簡単に言えば、thisは「this」オブジェクト(現在操作しているオブジェクト)を識別する特別なキーワードです。少し長く、より複雑な答えはこれです:

classがある場合、staticとnon _staticの2つのタイプのメンバー関数を持つことができます。非staticメンバー関数は、クラスの特定のinstanceを操作する必要があり、そのインスタンスがどこにあるかを知る必要があります。それらを助けるために、言語はthisと呼ばれ、特定の変数を自動的に指すようにする暗黙的な変数(つまり、何もすることなく必要なときに自動的に宣言される変数)を定義しますメンバー関数が動作しているクラスのインスタンス。

次の簡単な例を考えてみましょう。

#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;
}

これをコンパイルして実行するときは、thisの値がa1a2で異なることに注意してください。

8
Nik Bougalis

他の答えを補足するための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値を持ちます。

3
jxh

これは、DoSomething()が呼び出されるFooのオブジェクトを意味します。例で説明します

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 fooObject("first);
f.DoSomething();//it will prints out first

同様に、Fooコンストラクターに渡される文字列はすべて、DoSomething()の呼び出し時に出力されます。
たとえば、上記の例のDoSomething()では、「this」はfooObjectを意味し、do_something_to_a_foo()ではfooObjectが参照によって渡されるためです。

2
Aqeel Raza

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

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

静的メンバー関数にはthisポインターがありません(インスタンスに関連していないため)。

2
AngelCastillo

Acc。 to Balaguruswamyによるc ++によるオブジェクト指向プログラミング

thisは、this関数が呼び出されたオブジェクトを指すポインターです。たとえば、関数呼び出しA.max()は、ポインターthisをオブジェクトのアドレスに設定します。ポインターthisは、すべてのメンバー関数への暗黙の引数として機能します。

thisポインターの優れた例がここにあります。また、コンセプトの理解にも役立ちました。 http://www.learncpp.com/cpp-tutorial/8-8-the-hidden-this-pointer/

1
Rajat Garg

Foo::DoSomethingなどの非静的メンバー関数には、thisに値が使用される暗黙的なパラメーターがあります。標準では、これをC++ 11§5.2.2/ 4で指定しています。

関数が呼び出されると、各パラメーター(8.3.5)は、対応する引数を使用して初期化されます(8.5、12.8、12.1)。 [注:このような初期化は、相互に不定に順序付けられます(1.9)—末尾の注]関数が非静的メンバー関数である場合、関数(9.3.2)のthisパラメーターが初期化されます。明示的な型変換(5.4)のように変換された、呼び出しのオブジェクトへのポインター。

その結果、Fooを呼び出すにはDoSomethingオブジェクトが必要です。そのオブジェクトは単にthisになります。

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

1
Potatoswatter

ローカルポインターです。現在のオブジェクトをローカルオブジェクトとして参照します

0
Abhishek Kumar