2017-10-31 75 views
-3

std::cin >> x은 입력 스트림의 값을 변수 x에 저장합니다. 또한 cin은 입력 스트림을 가능한 한 오랫동안 검사하여 유효한 표현 인 x (공백을 건너 뜀)을 얻게됩니다. 그러나이 동작은 다른 데이터 형식에 대해 어떻게 정의되며 어떤 데이터 형식이 지원됩니까?cin과 cout은 어떻게 다른 데이터 유형을 지원합니까?

cin은 각 유형에 대해 >>에 단순히 다른 과부하가 있습니까? 기본 데이터 형식 만 지원합니까?

마찬가지로, std::cout은 값을 출력하는 방법을 알고 있습니까? 문자열로의 암시 적 변환을 사용한다고 가정하고 있지만이를 확인할 수는 없습니다.

+1

몇 가지 질문을하고 있습니다. 세 번째 부분은 https://stackoverflow.com/questions/2981836/how-can-i-use-cout-myclass –

+0

감사의 사본입니다. 나는 그들이 관련이 있다고 가정하고, 응답하는 것은 다른 사람들에게 도움이 될 것이라고 생각했다. –

+2

'에 대한 연산자''연산자''와 출력을위한''연산자''는 각 유형에 대해 오버로드됩니다. 기본적인 유형 만 지원하는 것은 아닙니다. std :: string은 근본적이지 않으며 자신의 클래스를 지원하기 위해 직접 오버로드 할 수 있습니다. 'cout'은 값을 출력하는 방법을 알지 못합니다. 여러분이 지나가고있는 타입에 대한 관련 오버로드가 발생합니다. – Steve

답변

1

컴파일러는 다양한 장소에서 operator<<라는 함수 (또는 operator>>)의 세트를 수집

  • 전류 범위
  • 왼쪽 피연산자 부재와베이스 클래스
  • 네임 왼쪽 피연산자 (friend 키워드를 사용하여 클래스 내에서 정의 될 수 있음)
  • 오른쪽 피연산자의 네임 스페이스 (를 사용하여 클래스 내부에서 정의 될 수 있음)키워드) 원시적 정수형
  • 에 적용
  • 내장 버전

그런 다음 이들의 어떤을 결정하기 위해에서 "일반"이름을 가진 함수를 호출 할 때와 같은 방법으로 오버로드 확인을 수행 용도. 암시 적 변환은 오버로드 확인 중에 고려되지만 일반적으로 데이터 형식에 대한 iostream 지원은 문자열에 대한 암시 적 변환보다 더 직접적인 일치를 제공하는 것을 포함합니다 (예 : 참조 변환이 더 좋음).

왼쪽 피연산자는 std::cout (또는 std::cin)이므로 멤버 또는 네임 스페이스를 많이 제어 할 필요가 없습니다. 그리고 내장 된 버전을 변경할 수 없습니다. 하지만 여전히 새로운 유형에 대한 지원을 추가하는 여러 가지 방법이 있습니다. 프로그램 작성자, 현재 범위 사용, 라이브러리 작성자는 작성한 클래스의 네임 스페이스를 사용합니다.

+0

감사합니다. 이 설명을 통해 나는 더 깊이 연구 할 수 있었다. 나는이 게시물이 매우 유용하다는 것을 알았다 : [C++에서 스트림 삽입 (<>) 연산자 오버로딩] (http://www.geeksforgeeks.org/overloading-stream-insertion-operators-c/) –