2012-05-15 5 views
1

C에서 C++ 로의 전환 이후 STL의 포맷 출력에 대한 질문이 있습니다. ostreams가 기본 유형을 다른 유형과 어떻게 구별합니까?법령은 기본 유형을 어떻게 구별합니까?

printf 및 서식 지정 문자열이있는 C에서는 매우 간단하지만 C++ ostream에서는 기본 유형을 자동으로 구분합니다. 그것은 나를 괴롭힌다. 예를 들어

다음 코드,

어떻게 I는 INT와 F 플로트가있다 "인식"COUT
int i; 
float f; 

std::cout << i << std::endl; 
std::cout << f << std::endl; 

? operator<<

+0

스트림은 STL과 관련이 없습니다. 당신은 C++ 표준 라이브러리에 대해 생각하고 있습니다. –

답변

7

컴파일러는 연산자를 함수 호출로 변환합니다.

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); 
    ... 
}; 

동일한 기본 아이디어는 보유하고 있습니다.

+2

모든 연산자''는 자유 함수는 아니며'int'와'float' 오버로드는 [멤버 함수]입니다. (http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt). 'std :: cout.operator << (int i);' –

+0

@JesseGood : 좋은 지적입니다. 그래서 제 예제는 사실이 정확하지 않습니다. 그것은 여전히 ​​기본적으로 정확합니다. 그리고 그것을 완벽하게 바꾸는 것이 주요 아이디어를 가릴 것입니다. 'std :: endl'이 실제로 코드화 된 방법을 기술하려고하는 것은 말할 것도없고 ... – Managu

+0

... 그리고 네,'class ostream'이 없다는 것을 알고 있습니다 ... – Managu

3

각 유형 (int, float 등)에 대한 연산자 < < 오버로드가 있습니다. 컴파일러는 컴파일 할 때 올바른 것을 선택합니다. 일반적으로 연산자 < <의 형식은 std::ostream& operator<<(std::ostream& stream, int number)입니다. 여기서 함수는 std 네임 스페이스에 정의 된 전역 함수입니다. 자신의 네임 스페이스에서이 함수의 정의를 덮어 쓰면이 함수의 정의를 덮어 쓸 수 있습니다 (인수 종속성 조회를 통해 수행됩니다).

사실이 함수가 스트림에 대한 참조를 반환한다는 것은 해당 문자열을 함께 끈다는 것을 의미합니다. 기억하십시오. 언제든지 연산자 < <을 볼 때마다, 그것은 단지 함수 호출입니다.

당신이보고 싶은데, 당신은 VS를 사용하는 경우

오픈

C : \ 프로그램 파일 마이크로 소프트 비주얼 스튜디오 9.0 \ VC \ \ (86)가 ostream에를 \ 등이 있습니다.

궁금하신 점이 있으시면 여기서 모든 정의를 찾으실 수 있습니다.

1

함수 오버로드는 컴파일 타임 다형성의 한 형태입니다. 간단한 예 : 이러한 std::cout 등의 std::ostream 유사한 방식 operator<<() 함수의 과부하의 경우

void times_two(int& x) { x *= 2; } 
void times_two(double& x) { x *= 2; } 

int i = 2; 
double d = 2.5; 

times_two(i); // i now 4 
times_two(d); // d now 5.0 

. GCC 3.4.4와 함께 제공되는 표준 라이브러리에서 :

__ostream_type& 
operator<<(int __n); 

__ostream_type& 
operator<<(double __f); 
관련 문제