1

クラスがあるとします:

class test {
public:
   void print();
private:
   int x;
};

void test::print()  
{  
    cout<< this->x;  
}

そして、私はこれらの変数定義を持っています:

test object1;
test object2;

私が呼び出すと、object1.print() thisたまたまの店の住所にobject1なり、印刷されたxものから取得し、電話すると、たまたまの店舗の住所になり、印刷されたものから取得します。それはどのように起こりますか?object1object2.print() thisobject2xobject2

4

5 に答える 5

6

各非静的メンバー関数には、thisポインターとして公開される暗黙の非表示の「現在のオブジェクト」パラメーターがあります。

だからあなたはそれを考えることができます

test::print();

いくつかあります

test_print( test* this );

グローバル関数などを書くとき

objectX.print();

あなたのコードでは、コンパイラはへの呼び出しを挿入します

test_print(&objectX);

このようにして、メンバー関数は「現在の」オブジェクトのアドレスを認識します。

于 2011-04-13T11:08:04.633 に答える
2

thisポインターは、関数に対する暗黙の引数であると考えることができます。次のような小さなクラスを想像してください

class C {
public:
  C( int x ) : m_x( x ) { }

  void increment( int value ) {
    m_x += value; // same as 'this->m_x += value'
  }

  int multiply( int times ) const {
    return m_x * times; // same as 'return this->m_x * times;'
  }

private:
  int m_x;
};

これにより、次のようなコードを書くことができます

C two( 2 );
two.increment( 2 );
int result = two.multiply( 3 );

さて、実際に起こっていることは、関数が呼び出されるオブジェクトを指す、追加のポインター引数を使用してメンバー関数incrementmultiplyが呼び出されることです。このポインターはthis、メソッド内として知られています。ポインターの型は、メソッドが(そのまま) かそうでないか ( の場合)thisによって異なります。constmultiplyincrement

同様のことを自分で行うこともできます。次のことを検討してください。

class C {
public:
  C( int x ) : m_x( x ) { }

  void increment( C * const that, int value ) {
    that->m_x += value;
  }

  int multiply( C const * const that, int times ) const {
    return that->m_x * times;
  }

private:
  int m_x;
};

次のようなコードを書くことができます

C two( 2 );
two.increment( &two, 2 );
int result = two.multiply( &two, 3 );

thisポインターの型は関数用であるため、ポインター自体だけでなく、指しているオブジェクトでもあることに注意しC const * constmultiplyくださいconstconstこれが、メソッド内でメンバー変数を変更できない理由ですthis。ポインターには、それを禁止する型があります。これは、キーワードを使用して解決できますmutable(あまり脇道にそれたくないので、それがどのように機能するかについては説明しません) const_cast

int C::multiply( int times ) const {
  C * const that = const_cast<C * const>( this );
  that->m_x = 0; // evil! Can modify member variable because const'ness was casted away
  // ..
}

this見た目ほど特別なポインターではないことを示しているため、これについて言及しています。この特定のハックは、メンバー変数を作成するよりも優れたソリューションであるmutableことがよくありmutableます。クラスのメソッド。 const

于 2011-04-13T11:11:41.400 に答える
1

それについて考える方法は、this現在作業しているオブジェクトのメモリへのポインターにすぎないということです。あなたがそうするならobj1.print()、それからthis = &obj1;。もしそうならobj2.print()、それからthis = &obj2;

于 2011-04-13T11:03:29.320 に答える
1

thisオブジェクトごとに異なる値を持つ

于 2011-04-13T11:03:55.660 に答える