1. ホーム
  2. c++

[解決済み] C++でアンパサンド(&)記号はどのように機能するのでしょうか?重複

2022-03-02 06:58:30

質問

<ブロッククオート

重複の可能性があります。
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言語では、&は通常varのアドレスを意味しますが、ここではどのような意味でしょうか?これはポインタ記法の洒落た方法なのでしょうか?

ポインター表記と仮定しているのは、これが結局のところポインターであり、2つのポインターの等価性をチェックしているからです。

私はcplusplus.comで勉強しているのですが、このような例題があります。

どのように解決するのですか?

まず始めに、以下のことに注意してください。

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 参照される . つまり、メモリアドレスを返すのではなく、そのメモリアドレスに位置するオブジェクトを返すのです。