2012-01-13 11 views
26

可能性の重複:
What are the differences between pointer variable and reference variable in C++?アンパサンド(&)記号は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; 
} 

は通常、VARのアドレスを意味しています。ここではどういう意味ですか?これはポインタ記法の素晴らしい方法ですか?これはポインタなので、私はそれがポインタ表記であると仮定している理由は、結局はポインタであり、2つのポインタの等しいかどうかをチェックしているからです。おかげさまで

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)を参照して、引数を渡す:

+10

無礼を意図するものではありませんが、これについてはC++の入門書の最初の数章で説明します。相談することをお勧めしますか? –

+0

よく私はcplusplus.comから勉強しており、この例があります。 – infinitloop

+4

"*私はcplusplus.comから勉強しています*"これはあなたの最初の間違いです。このサイトは参考にはならず、特に**良い学習リソースではありません。 – ildjarn

答えて

33

は、クラスの中に特殊なポインタ(==メモリアドレス)です。 まず、オブジェクトがインスタンス化される:

CDummy a; 

次に、ポインタがインスタンス化される:

b = &a; 

CDummy *b; 

次に、aのメモリアドレスがポインタbに割り当てられています次に、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の使用を、注意してください。つまり、メモリアドレスを返す代わりに、そのメモリアドレスにあるオブジェクトを返します。

+1

本当に良いブレークダウン、ありがとうございます。 – tetris11

37

&はつ以上の意味を有します参照変数を宣言する

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

+4

ビット単位*と* –

+1

質問は具体的です。 Qのコードではどういう意味ですか? –

+1

私はdownvotesに対して何も持っていませんが、なぜ私は何かを学ぶかもしれないことを知りたいのですが。 –

1

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

this 

ことに注意して、起動するには

関連する問題