1) 次のような場合
cout << 3.0 + 3 ;
cout に渡された値が int か float かをどうやって知るのでしょうか?
どちらでもない。ダブルです。3.0
型 double を持ち3
、加算のために double に昇格されます。double に double を追加した結果は double です。それは、結果に対して行われていることとは無関係です。
ostream には多数のオーバーロードされた左シフト演算子があり、右側には double 型の引数用の演算子があるため、次のように呼び出されます。
template <class Elem, class Traits>
basic_ostream<Elem, Traits>& basic_ostream<Elem, Traits>::operator<<(double d);
価値があるのは、それはメンバー関数であり、フリー関数ではありません。
オーバーロードを利用してこれを行います
ostream& operator<<(ostream& output, int i) {
// It's an int
}
ostream& operator<<(ostream& output, float f) {
// it's a float
}
C++ コンパイラは<<
、入力の型に基づいて演算子の適切なオーバーロードを選択します。a を渡すと、 aと for が同じfloat
オーバーロードが選択されますfloat
int
操作の結果3.0 + 3
はdoubleであるため、coutはdouble型に<<演算子を適用します。
これを決定するには、デバッガーのステップイン機能を使用できます。どのcoutメソッドに入力するかがあなたの答えです