2011-05-30 11 views
1

次のコードはコンパイルされて実行されますが、私は下位レベルで正確に何が起こっているのか分かりません。参照は参照されているオブジェクトのアドレスを格納するだけではありませんか?その場合、両方のテスト関数がパラメータとしてアドレスを受け取っていますか?あるいは、C++の実装は、これらの型を別の方法で区別することができますか?あなたが関数にint&を渡しており、それはint&int*ようint*次の場合、関数のオーバーロードはどのように機能しますか?

答えて

7

に変換することができないためだけchar test(int&i)と一致コーディング

int main() { 
    int i = 1; 
    cout << test(i) << endl; 
} 

char test(int &i) { 
    return 'a'; 
} 

char test(int *i) { 
    return 'b'; 
} 
+0

ああこれは私には明らかなことです –

1

は異なるタイプであり、iint&として扱うことができるが、 int*ではなく、ここでは過負荷解決は絶対に明白です。

この時点では、参照はちょっと隠された種類のポインタにすぎません。言語の観点から見ると、それらは異なるタイプです。

2

C++での参照は、ポインタよりもエイリアスに似ています。参照はそれ自身では別個の変数ではありませんが、既存の変数の新しい「名前」です。あなたの例では、関数に整数を渡すので、最初のテストが呼び出されます。ポインタは、別の変数のアドレスを保持する別の変数です。したがって、2番目の関数を呼び出すには、ポインタを使ってtestを呼び出す必要があります。そうですね... test(&i); &は、&で宣言された変数がint &iのような参照を宣言している間に、演算子を混乱させるようなものは変数のアドレスを取得します。

関連する問題