2011-08-24 14 views
4

클래스에 대해 < < 연산자를 오버로드하면 (이것이 SomeClass에서 친구로 정의 된 것처럼) 왜 ostream에 대한 참조를 가져 와서 해당 ostream을 반환합니까?Ostream << 과부화 혼란

ostream& operator<<(ostream& s, const SomeClass& c) { 
    //whatever 
    return s; 
} 

참조로 직접 수정할 수있는 경우 ostream을 반환하면 어떤 이점이 있습니까? 이것은 나에 대한 중복 보인다 - 나는 확신하지만 당신이 같은 operator<<의 체인-호출 쓸 수

답변

4

이 중복이 아니라 전화를 체인하는 데 유용합니다. 그것은 표준 : : 문자열 : APPEND 같은 기능을보고 쉽게, 그래서 내가 그와 함께 시작합니다 :

std::string mystring("first"); 
mystring.append(" second"); 
mystring.append(" third"); 

과 같이 다시 쓸 수있다 :

std::string mystring("first").append(" second").append(" third"); 

이 가능하기 때문에으로 .Append() .append (...)를 계속 추가 할 수 있도록 수정 한 문자열에 대한 참조를 반환합니다. 현재 수행중인 작업과 관련된 코드는

std::cout << "first"; 
std::cout << " second"; 
std::cout << " third"; 

등으로 변경됩니다. 연산자 < <이 스트림을 반환하기 때문에, 우리는 또한 이것을 연결할 수 있습니다!

std::cout << "first" << " second" << " third"; 

유사점을 참조하십시오. 유용성은?

+0

감사합니다. 모두에게 비슷한 답변이 있었지만 예제가 좋았습니다. 작동 방식이 훨씬 명확했습니다. :) –

4

그래서 :) 아니에요 : 당신이 ostream&를 반환하지 않는 경우

stream << s1 << s2 << s3 ; 

, 당신은 기록 할 수 없습니다 그것은 한 번 이상.

당신도 같은 것을 생각할 수 있습니다 :

operator<<(operator<<(operator<<(stream, s1), s2), s3); 

또는,

((stream << s1) << s2) << s3 ; 

먼저 (stream << s1) 반환 stream&있는 다시 <<를 호출하고 그것을 다시하는 stream&을 반환 stream << s2된다 <<을 호출하면 stream << s3이됩니다.

5

출력을 함께 묶을 수 있습니다. 이 같은 동일합니다

std::cout << someObj << someValue; 

: 마찬가지로

operator<<(operator<<(std::cout, someObj), someValue); 
1

아는, 이것이 너무 < < COUT

같이, 출력 링크 "이"< <는 < < "펜"< < ENDL "는";

은 여전히 ​​작동합니다.

관련 문제