web-dev-qa-db-ja.com

アンパサンド(&)記号はC ++でどのように機能しますか?

可能性のある複製:
C++のポインター変数と参照変数の違いは何ですか?

これは私を混乱させています:

class CDummy 
{
public:
   int isitme (CDummy& param);
};

int CDummy::isitme (CDummy& param)
{
  if (&param == this)
  { 
       return true; //ampersand sign on left side??
  }
  else 
  {    
       return false;
  }
}

int main () 
{
  CDummy a;
  CDummy* b = &a;

  if ( b->isitme(a) )
  {
    cout << "yes, &a is b";
  }

  return 0;
}

Cでは、通常、変数のアドレスを意味します。ここでどういう意味ですか?これはポインター表記の派手な方法ですか?

これがポインターであり、2つのポインターが等しいかどうかを確認しているため、ポインター表記であると想定している理由です。

私はcplusplus.comから勉強していて、彼らはこの例を持っています。

40
infinitloop

開始するには、注意してください

_this
_

クラスへの特別なポインタ(==メモリアドレス)です。最初に、オブジェクトがインスタンス化されます:

_CDummy a;
_

次に、ポインターがインスタンス化されます。

_CDummy *b;
_

次に、aのメモリアドレスがポインターbに割り当てられます。

_b = &a;
_

次に、メソッドCDummy::isitme(CDummy &param)が呼び出されます。

_b->isitme(a);
_

このメソッド内でテストが評価されます:

_if (&param == this) // do something
_

ここがトリッキーな部分です。 paramはCDummy型のオブジェクトですが、_&param_はparamのメモリアドレスです。そのため、paramのメモリアドレスは、「this」という別のメモリアドレスに対してテストされます。このメソッドが呼び出されるオブジェクトのメモリアドレスをこのメソッドの引数にコピーすると、trueになります。

この種の評価は通常、コピーコンストラクターをオーバーロードするときに行われます

_MyClass& MyClass::operator=(const MyClass &other) {
    // if a programmer tries to copy the same object into itself, protect
    // from this behavior via this route
    if (&other == this) return *this;
    else {
        // otherwise truly copy other into this
    }
}
_

また、this参照解除である_*this_の使用にも注意してください。つまり、メモリアドレスを返す代わりに、そのメモリアドレスにあるオブジェクトを返します。

48
rwols

&には複数の意味があります。

1)変数のアドレスを取得する

int x;
void* p = &x;
//p will now point to x, as &x is the address of x

2)関数への参照により引数を渡す

void foo(CDummy& x);
//you pass x by reference
//if you modify x inside the function, the change will be applied to the original variable
//a copy is not created for x, the original one is used
//this is preffered for passing large objects
//to prevent changes, pass by const reference:
void fooconst(const CDummy& x);

3)参照変数を宣言する

int k = 0;
int& r = k;
//r is a reference to k
r = 3;
assert( k == 3 );

4)ビットごとのand演算子

int a = 3 & 1; // a = 1

n)その他???

61
Luchian Grigore

まあCDummy& param関数のパラメーターとして宣言されているCDummy::isitmeは実際には 参照 であり、これはポインターに似ていますが、異なります。参照について注意する重要なことは、それらがパラメーターとして渡される関数内では、型へのポインターではなく、型のインスタンスへの参照が本当にあるということです。したがって、コメントのある行では、 '&'はCと同様に機能し、渡された引数のアドレスを取得し、それをthisと比較しています。メソッドが呼び出されるクラスのインスタンス。

2
Hoons