私はC++にかなり慣れていないので、次のシナリオでthis
ポインターが何をするのか理解できません。
void do_something_to_a_foo(Foo *foo_instance);
void Foo::DoSomething()
{
do_something_to_a_foo(this);
}
私はここに他の誰かの投稿からそれをつかみました。
this
は何を指していますか?よくわかりません。関数には入力がないので、this
は何をしていますか?
this
は現在のオブジェクトを指します。
キーワードthis
は、特殊なタイプのポインターを識別します。 _class A
_のx
という名前のオブジェクトを作成し、_class A
_に非静的メンバー関数f()
があるとします。関数x.f()
を呼び出すと、f()
の本文のキーワードthis
にx
のアドレスが格納されます。
簡単に言えば、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
の値がa1
とa2
で異なることに注意してください。
他の答えを補足するための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
値を持ちます。
これは、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が参照によって渡されるためです。
thisは、自己(thisを呼び出したオブジェクト)へのポインタです。
静的メソッドではないgetColor()を持つ、carという名前のCarクラスのオブジェクトがあるとします。このgetColor()内部での呼び出しは、car(クラスのインスタンス)のアドレスを返します。
静的メンバー関数にはthisポインターがありません(インスタンスに関連していないため)。
Acc。 to Balaguruswamyによるc ++によるオブジェクト指向プログラミング
this
は、this
関数が呼び出されたオブジェクトを指すポインターです。たとえば、関数呼び出しA.max()
は、ポインターthis
をオブジェクトのアドレスに設定します。ポインターthis
は、すべてのメンバー関数への暗黙の引数として機能します。
this
ポインターの優れた例がここにあります。また、コンセプトの理解にも役立ちました。 http://www.learncpp.com/cpp-tutorial/8-8-the-hidden-this-pointer/
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
のアドレスを取得できないことです。
ローカルポインターです。現在のオブジェクトをローカルオブジェクトとして参照します