2010-12-19 6 views
2

私はここ数日でC++を教えてきましたが、いくつかの状況で私はさらに詳しい説明をすることができました。明らかなクラス、ネーミングなどの他に、次のメソッドの違いは何ですか?私はメモリポインタについてちょっと混乱しています

値を受け取り、参照によって渡され、同じことをするメソッドはどちらもありますか?もしそうなら、違いは何ですか?だから私はあなたがメソッドの引数には、メモリポインタを受け取ることになる方法を書いたときに宣言されたようにあなたがそれを書かなければならないことを前提と

addNPC(&sprite); 

:私が最初に読み始めたとき、私はこのように呼ばれるメソッドを見ましたメモリポインタ/位置、および単なる値ではありません。しかし、私はOnTimerメソッドを見て、それも参照が渡されていることがわかります。違いは何ですか?

最後に、これらの2つのものは同じで、実際のコーディングスタイルですか?

void addNPC(Sprite& spr) ... 
void addNPC(Sprite &spr) ... 
+0

宿題? ------ :-) –

+0

私はそう思わない:-) – anatolyg

+0

ハ。いいえ、ちょうどC++をやったことはありません。 – Nathan

答えて

1
void addNPC(Sprite *spr) 

上記のコードでは、ポインタを受け取ると、以下のようにSpriteオブジェクトのアドレスを渡す必要があります。

addNPC(&sprite); 

および機能に

void OnTimer(wxTimerEvent &event) 

コールは、それがwxTimerEventオブジェクトへの参照を取ると、以下のようにする必要があります。場所を呼び出す時

wxTimerEvent evt; 
OnTimer(evt);//Passing object by reference. 

の両方値渡しと 参照渡しため、構文は同じです。

最後の質問では、どちらも同じです。コーディングスタイルの違いです。

4

最後に質問すると、2つの関数プロトタイプは同等です。空白はCやC++ではほとんど意味がありません。

参照とポインタの違いについては、参照を「構文的な砂糖」と見なします。追加の制限はNULLにすることはできません。詳細については、C++のよくある質問を参照してください。https://isocpp.org/wiki/faq/references

+1

**既存のポインタの理解からの参考文献の理解を導き出そうとしないでください**。何かあれば、それは逆の方向でなければなりません。ポインタの派生した参照のメンタルモデルに十分な "例外"を追加して、実際に正確であることを確認した時点で、あなたが始めたよりもうまくいくわけではありません。しかし、** **リンクを参照してください - そこに一流の材料。 –

+0

別のプログラミング言語から来ている場合は、参照の点でポインタを考える方が良いでしょう。私はボトムアップ、ハードウェアからOSに教えられていたので、ポインタが最初に来た(特に、後になるまでリファレンス言語に晒されていなかったため)。 –

+0

リンクありがとうございます。私は、始めるために何か後方にあると思っていました。 :) – Nathan

1

wxTimerEvent &eventはオブジェクトへの参照です。通常の変数のように動作しますが、関数の外部の変数を参照します。ローカル参照に加えられた変更は、実際に元のものを変更しています。基本的には、通常の変数としてアクセスできるポインタであり、NULLにはなりません。

Sprite *sprは、外部変数への実際のポインタです。ローカルで行われた変更は、その機能の外でも行われます。それはNULLにすることができます!

最後の2つの項目は同じです。スペースはC/C++コードでは重要ではありません。

1

他の回答に加えて、const参照の1つの機能があります。一時参照オブジェクトを割り当てることができ、オブジェクトはconst参照が有効である限り存続します。

参照のユーザーがオブジェクトの破壊を担当しない場合は参照を使用し、NULLオブジェクトが意味をなさない場合は参照を使用します。

ここでは、一時オブジェクトのconst参照の説明についてはGotW #88です。

関連する問題