67

重複の可能性:
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 から勉強していますが、この例があります。

4

3 に答える 3

110

The&には、さらに 1 つの意味があります。

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) その他???

于 2012-01-13T22:06:29.270 に答える
62

まず、次のことに注意してください。

this

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

CDummy a;

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

CDummy *b;

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

b = &a;

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

b->isitme(a);

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

if (&param == this) // do something

ここがトリッキーな部分です。param は CDummy 型のオブジェクトですが、&paramparam のメモリアドレスです。そのため、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で、参照解除されています。つまり、メモリ アドレスを返す代わりに、そのメモリ アドレスにあるオブジェクトを返します。

于 2012-01-13T22:25:05.493 に答える
2

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

于 2012-01-13T22:10:43.050 に答える