コンパイラは、演算子を関数呼び出しに変換します。となることによって
std::cout << i
になる
operator<<(std::cout, i)
標準ライブラリ ヘッダーの腸の奥深くに埋もれている場所に、関数宣言があります (機能的には次のものと同等です)。
std::ostream& operator<<(std::ostream& o, int i);
std::ostream& operator<<(std::ostream& o, double d);
つまり、operator<<
過負荷です。関数呼び出しが行われると、コンパイラは、渡された引数に最適な関数オーバーロードを選択します。
の場合std::cout << i
、int
オーバーロードが選択されます。の場合std::cout<<d
、double
オーバーロードが選択されます。
工夫された例を使用すると、関数のオーバーロードの動作をかなり簡単に確認できます。
#include <stdio.h>
void print(int i) {printf("%d\n", i);}
void print(double d) {printf("%f\n", d);}
int main()
{
int j=5;
double f=7.7;
print(j);
print(f);
}
出力の生成:
5
7.700000
自分で試してみてください: http://ideone.com/grlZl .
編集:Jesse Goodが指摘しているように、問題の関数はメンバー関数です。つまり、実際には次のようになります。
std::cout << i
になる
std::cout.operator<<(i)
そしてヘッダーには宣言があります(と同等):
class ostream {
ostream& operator<<(int i);
ostream& operator<<(double d);
...
};
ただし、基本的な考え方は同じです。