-4

重複の可能性:
C ++のポインター変数と参照変数の違いは何ですか?
アンパサンドが含まれる関数プロトタイプとはどういう意味ですか?

私の理解では、

void bar(int &x) { ... }

参照による通過を意味するxようです。しかし、C ++には、すでにポインターなどがあります。では、どのような違いがありますか

void bar(int *x) { ... }
// then call by
bar(&x);

長いという事実は別として...私は2番目の方法を使用する場合にも気づきましたが、渡す場合と->は対照的に使用する必要があります...なぜですか?.struct

4

2 に答える 2

3

StroustrupがC++への参照を導入する理由は、演算子のオーバーロードです。

http://www.stroustrup.com/bs_faq2.html#pointers-and-references

サンプル関数では、ユーザーが(ポインターを受け取るため)barとして呼び出す必要があるか、(参照を受け取るため)で呼び出すことができるかは大した問題ではありません。少なくとも、Cプログラマーはそうではないと考えています。bar(&x)bar(x)

ただし、演​​算子のオーバーロードがC ++に追加されたとき、Stroustrupは、オーバーロードされた演算子をポインターで使用することは非常にエレガントではないと考えました(彼の言葉では「醜い」)。

参照には、一時オブジェクトをconst参照にバインドできるなど、ポインターよりも機能的にいくつかの利点がありますが、&演算子を適用することはできません。そのため、pass-by-const-reference関数は、pass-by-pointer-to-constの同等の関数と比較して、呼び出し元に(変数を作成するための)コード行を節約することがあります。

このため、可能な規則の1つは、関数がアドレスを格納した後、将来使用するためにアドレスをどこかに格納する場合はポインターを受け入れ、そうでない場合は参照を受け入れることです。ダングリングポインタ/参照を作成するためのすべての可能な方法を妨げるわけではありませんが、大きなものをキャッチします。ただし、機能スタイルのコードを作成する場合は不幸な結果を招くため、すべての人に適しているわけではありません。

また、2番目の方法を使用する場合は、ではなく->を使用する必要があることに気付きました。構造体を渡すと...なぜですか?

.構造体のメンバーにアクセスするため、構造体->へのポインターを介してメンバーにアクセスするために、Cから継承された構文にすぎません。Cでは、LHSのポインターでのみ使用でき、LHSのポインターで使用->することはできません.。したがって、異なる記号は厳密には必要ありません。コードを読みやすくしてリマインダーを付けるのに役立ちます。たとえば、.両方に同じ記号が使用されている場合、(*ptr).memberはと同じことを意味し、ptr.memberおそらく混乱を招きます。

C ++では、この違いが言語にとって有用になります。クラスタイプに対してオーバーロードできoperator->ます。たとえば、スマートポインタはオーバーロードします。ただし、クラスタイプには、でアクセスできるメンバーを含めることができます.。つまり、「スマートポインターの参照で関数をsome_smart_ptr->get();呼び出す」を意味し、「スマートポインターで関数を呼び出す」を意味します。get()some_smart_ptr.get()get()

于 2012-10-19T09:36:08.937 に答える
1

参照は基本的に定数アドレスを持つポインターであるため、アドレスによる呼び出しと同じ効果があります。これは主に構文の違いです。呼び出しサイトからは値で呼び出しているかのように見えるため、参照による呼び出しの方が便利です(一時的なものに注意する必要がある場合を除く)。

于 2012-10-19T09:37:03.377 に答える