1

私は C++ を学習しようとしていますが、使用しているチュートリアルでこの紛らわしい例に出くわしました。おそらく誰かがこれを明確にしてくれます。

次のコードはチュートリアルからのものです。// <---私が混乱している部分を示す「タグ」を付けました。

#include <iostream>
using namespace std;

class CDummy {
  public:
    // signature: accepts an address 
    int isitme (CDummy& param);
};

// actual function that accepts an address passed in from main set to
// the param variable
int CDummy::isitme (CDummy& param) // <--- 1
{

ここで、紛らわしい部分が発生します。アドレス変数のアドレスを取得しています??? アドレスはすでに渡されていませんでしたか?

  if (&param == this) return true; // <--- 2
  else return false;
}

int main () {
  CDummy a;
  CDummy* b = &a;
  // passes in the class 
  if ( b->isitme(a) )
    cout << "yes, &a is b";
  return 0;
}

以下は、私にとって意味のあるコードです

#include <iostream>
using namespace std;

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

int CDummy::isitme (CDummy *param) // <--- 1
{

この部分は完全に理にかなっています。param はポインターであり、クラス a のポインターとクラス b のポインターを比較しています。

  if (param == this) return true; // <--- 2
  else return false;
}

int main () {
  CDummy a;
  CDummy *b = &a;
  // pass in the address.
  if ( b->isitme(&a) )
    cout << "yes, &a is b";
  return 0;
}

コード サンプルのうち、正しいものはどれですか? どちらも機能するため、これが推奨される方法であるという意味で正しいです。また、最初の例でアドレスのアドレスを取得しているのはなぜですか?

これが以前に回答されている場合は申し訳ありませんが、見つけることができませんでした。ありがとう

4

3 に答える 3

4
int CDummy::isitme (CDummy& param) // <--- 1

C++ では、値ではなく参照によってパラメーターを渡す&手段。住所を示すものではありません。

CDummy & paramまたはが表示される場合があることに注意してくださいCDummy &param。それはすべて同じです。

于 2012-12-25T19:58:01.747 に答える
3

お気に入りの C++ の本を持ってきて、参照について読む必要があります。

この宣言では

int CDummy::isitme (CDummy& param)

paramあなたが信じているように、アドレスではありません。参考です。

&参照宣言で使用されている文字に惑わされたのは、あなたが初めてではありません。この質問は、StackOverflow で以前に何度も尋ねられました。

C++ の参照変数とは何ですか?

C++のポインタ変数と参照変数の違いは何ですか?

しかし、私の意見では、本/ガイド/チュートリアルはより良い出発点になるでしょう.

于 2012-12-25T19:58:17.110 に答える
1

単項&はそのオペランドのアドレスを返します。また、パラメーターで使用する場合は、参照渡しを示します。

于 2012-12-25T19:59:18.630 に答える