컴파일러는 연산자를 함수 호출로 변환합니다.
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);
...
};
동일한 기본 아이디어는 보유하고 있습니다.
스트림은 STL과 관련이 없습니다. 당신은 C++ 표준 라이브러리에 대해 생각하고 있습니다. –