2012-01-30 13 views
1

さて、私は深くC++に慣れてきました。遅くて、すべてがダウンしています。最終的には、ポインタを使うべきかどうか、正しく実装する方法など、ポインタは意味をなさないようになっています。C++:ポインタ構文の相違点

しかし、まだ答えが必要だったポインタの基本的な使い方について少し疑問がありました。 fooに次の呼び出しの違いは何でしょう...次のクラスAと機能foo(A* bar)

...

class A 
{} 

void foo(A* bar) 
{} 

:私は、右のコードにジャンプしますか?

A* a; 
A b; 

foo(a); 
foo(&b); 

は、彼らは両方の罰金、コンパイル、および限り私が覚えて、私は彼らとの問題を持っていませんでした。

私はA* a;ニーズがnewで作成するのに対し、A b;が(それは実際にオブジェクトを作成していないので、それだけの潜在的Aオブジェクトへの4バイト長の参照を開催しています)、右がインスタンス化されると思います。

私は、私が正しく、この考えていた場合、a = b;EDITa = &bことを確認)してから、正常fooaを渡すことができます。しかし、a = &bfooが、aが指す(存在しない)オブジェクトを読み込もうとすると、実行時エラーが発生します。

また、上記が正しい場合、正常にfoo(&b);と呼ぶことができます。

正しいですか?

ありがとうございます!

答えて

5

はい、ご理解ください。

foo(&b); 

foo()を関数へのパラメータとしてタイプAの既存のオブジェクトのアドレスを渡します。

foo(a); 

は、関数パラメータとしてA型へのポインタを渡します。有意義な何かを行うためには、有効なAオブジェクトを指していなければなりません。これは二つの方法で行うことができますスタック上のオブジェクトの割り当て


このオブジェクトへのポインタaポイントを作る&スタックに(ローカルストレージ)タイプAのオブジェクトを作成する:

A* a; 
A b; 

a = &b; 

動的なメモリ割り当て:

A *a = new A; 

のThあなたが動的なメモリ割り当てを行うたらoughは、明示的に使用した後alloatedメモリを解放するために覚えているだろうか、メモリリークがあります:限り動的な割り当てを避けるために、常に優れていることを

delete a; 

注意を可能であれば、ローポインタの代わりにSmart pointersを使用してください。

+0

@SethCarnegie:はい。修正されました。それを指摘してくれてありがとう。 –

+0

スマートポインタの良いリンク。以前は聞いたことがありませんでしたが、非常に便利です。私はそれらを調べなければならないでしょう! – Qix

+2

@ Di-0xide:あなたはすべきです。 RAIIは、C++の最も強力で優れた機能の1つです。 –

0

ほとんど正しいです。ポインターが4バイトであると想定すべきではありません(たとえば、amd64システムでは8個)。また、割り当てはa = &b;でなければなりません(アドレス演算子の追加に注意してください)。それ以外は、かなり妥当と聞こえます。

4

a = bは実行できません。

それはbアドレスにaを設定するには、a = &bでなければならないであろう。

メモリ管理については、bが割り当てられていますが、aはポインタのためだけに領域を割り当て、実際のオブジェクトを作成しています。

foo(&b)は、あなたが(a = new A()経由など)*aを初期化する前に、foo(a)の動作は未定義されるだろうファイルを、動作します。

+0

おっと!うん、私は '&'! – Qix

3

C++では、ポインタはファーストクラスのオブジェクトです。ポインタは、アイデンティティを持つために関連オブジェクトを必要とする目に見えない参照だけではありません。これはJava/C#参照が実際に動作する方法です(実際にはほとんどの言語で使用されますが)。ポインタはそれ自体のオブジェクトです。

したがってA* aはポインタを宣言します。それは何かを指していないし、には何かを指すためにがありません。そして、それが何かを指している場合は、それは自身の何かを必要としません。

a = new A()のようにする必要はありません。 a = &bも同様に(aにはオブジェクトbのアドレスが含まれている)、またはAタイプの他のオブジェクトを指すこともできます。ポインタはアドレスを格納する単なるオブジェクトです。それは、「作成する必要がある」「を目的としている」という考えを捨てる。

をそれ(またはそれが特別な値NULLが含まれている)のアドレスが含まれているオブジェクト、であり、それはアドレスが含まれている場合そのアドレスにタイプAのオブジェクトが存在する場合と存在しない場合があります。