は、私はC++に関連する2つの質問があります。多くの教科書にキーワード "this"の実際の意味は何ですか?
を、キーワードthis
は呼び出すオブジェクトへのポインタです。正しい? 、
sizeof(a) : 4
sizeof(b) : 8
Base::g()
sizeof(*this) : 4
Base::f()
Base::g()
sizeof(*this) : 4 // why 4 bytes not 8 bytes?????????
Derived::f()
がthis
場合は、呼び出し元のオブジェクトを指している:
struct Base
{
void g();
virtual void f();
};
void Base::f() {
cout << "Base::f()" << endl;
}
void Base::g() {
cout << "Base::g()" << endl;
cout << "sizeof(*this) : " << sizeof(*this) << endl;
this->f();
}
struct Derived : public Base
{
int d;
void f();
};
void Derived::f()
{
cout << "Derived::f()" << endl;
}
int main()
{
Base a;
Derived b;
cout << "sizeof(a) : " << sizeof(a) << endl;
cout << "sizeof(b) : " << sizeof(b) << endl;
a.g();
b.g();
}
上記のコードは次の出力を生成します。私は、コードで遊ぶのが好きなように
は、私は、次の簡単なコードを書きました呼び出すオブジェクトがb
であるため、sizeof(*this)
の2行目が4ではなく8を出力しますか?ここで実際に何が起こっていますか? this
は降格されましたか?
this
の場合はthis->f()
が正しい関数を呼び出す方法、Base
を入力することが降格されましたか?私は本当に混乱しています。
てみてください():それは
Base
のサイズは4バイトであることを知っているので、コンパイラは、基本的に、このように、その文をリライトしますそれが何を出すかを見てください。 Base :: g()の呼び出しは、それがサブクラスの一部であることを知らない。その場合、*これは正当にBaseを参照し、Derivedは参照しません。 –そして 'sizeof(* this)'がコンパイル時にどのように評価されると思いますか?これは 'sizeof(Base)'と変わりません。 –