6

pointers&の違いをたくさん読んでくださいreferences

これが私が学んだことの簡単な説明です。

1。ポインタが定義されると、メモリが割り当てられます。ただし、参照は名前エイリアスであるため、メモリは割り当てられません(Is it correct?)。

2。参照は定数ポインタで実装されているため、他のオブジェクトを指すようにすることができないため、参照は定義時に初期化されるようにバインドされています。ただし、ポインタは定義時に初期化する必要がないため、他のオブジェクトを指すように変更することもできます。

3。参照は自動的に参照解除されます。あなたが書くときcout << p; コンパイラによって自動的に参照解除され、cout << *p;として扱われます。コンパイラによって。

ここで、pは参照です。

  1. 参照への参照はできません。参照への参照を宣言するときはいつでも、実際には同じ変数への参照です。例えば

    int i;    
    int &r1=i;    
    int &r2=r1; <-------------------2
    

コンパイラーはステートメント2を次のように解釈します
。int&r2 =(* r1)
および(* r1)は変数i自体に他なりません。

ただし、ポインタへのポインタは可能です。

5。ポインタの配列は可能ですが、参照の配列は不可能です(なぜですか?)。

6。ポインタのアドレスが可能です。参照先住所はご利用いただけません。変数のアドレスを示します。

7。参照を使用しなければならない状況があります。そこではポインタを使用できません。以下の例を考えてみましょう。

A a = b + c;

ここで、a、b、cはクラスAのオブジェクトです。演算子「+」は次のようにオーバーロードされます。

const A& operator+(const A& o)
{
     return A(i+o.i);
}

こちらのサンプルコードを参照してください:http: //ideone.com/Q0pE1

ここでは、引数リストの参照を使用してメモリフットプリントを保存しています。
演算子関数でオブジェクトのアドレスを渡す必要があるため、引数リストでポインタを使用することはできません。
A a =&b +&c;
ただし、パラメータリストでポインタが使用されている場合は、オブジェクト自体ではなくアドレスを追加することになります。

私が見逃している他のポイントはありますか?

いつポインターに行くべきですか、そしていつ参照するべきですか?

4

1 に答える 1

9

ポインタが定義されると、メモリが割り当てられます。ただし、参照は名前のエイリアスであるため、メモリは割り当てられません

「メモリが割り当てられている」とはどういう意味ですか?newとかmalloc何かのように、ヒープ割り当てを意味する場合は、いいえ

int val = 5;
int *pVal = &val; //No dynamic memory allocation.

ポインタのサイズは、サイズと同じintです。しかし、それは「割り当て」とは異なります。

参照は定数ポインタで実装されているため、他のオブジェクトを指すようにすることができないため、参照は定義時に初期化されるようにバインドされています。

いいえ、参照は初期化時にバインドされます。これが参照の動作方法だからです。それらはオブジェクトへの参照です。言語は、彼らが拘束されないことは不可能であり、彼らの拘束が後で変わることは不可能であると述べています。したがって、参照は初期化時にバインドされる必要があります。

コンパイラが参照を実装する方法はまったく関係ありません。

参照は自動的に参照解除されます。

いいえ。参照を取り消すものは何もありません。参照は、既存のオブジェクトの単なる別名です。それで全部です。

ポインタの配列は可能ですが、参照の配列は不可能です(なぜですか?)。

参照は初期化時にバインドする必要があるためです。また、配列の各メンバーにバインドする個別のオブジェクトを指定することはできません。したがって、配列の作成と参照のバインドの間にいくつかのステップが必要になります。これは許可されていません。

ポインタのアドレスが可能です。参照先住所はご利用いただけません。変数のアドレスを示します。

参照は、既存のオブジェクトの別名です。名前のアドレスを取得できません; オブジェクトのアドレスのみを取得できます。

参照を使用しなければならない状況があります。

operator+タイプへのポインタのオーバーロードを妨げるものは何もありません。

A operator+(const A *lhs, const A *rhs) {...}

もちろん、これは非メンバー関数です。

ああ、そしてボーナスとして:

const A& operator+(const A& o)
{
     return A(i+o.i);
}

これは壊れています。const&作成した一時的なものに戻ります。値で返す必要があります。

于 2012-07-26T02:15:35.843 に答える