오버로드 된 < < 연산자가 정의되어 있지 않으면 예외는 없습니다. < <의 기존 오버로드는 ostream & (* fp) (ostream &)의 조작자를 예상합니다.
당신이 그것을 유형 ostream에 & (* FP)와 조작을 준 경우 그렇지 않은 ()가 당신은 컴파일러 오류를 얻을 것이 운영자 < < (ostream에 &, ostream에 &에 대한 정의 (* fp)()). 이 기능을 원하면 < < 연산자에이 유형의 조작기를 허용하도록 과부하를 걸어야합니다.
당신은 이것에 대한 정의를 작성해야 :
ostream에 & ostream에 :: 연산자를 < < (ostream에 & (* m)())
마법 아무것도 여기에 일이되지 않도록 여기 명심 . 스트림 라이브러리는 표준 C++ 기능 (연산자 오버로딩, 클래스 및 참조)에 크게 의존합니다.
우리가 조작하려고하는 스트림에 대한 참조를 통과하지 않고, 우리는 스트림에 수정을 할 수 없습니다 : 이제
당신은 우리가하지 않는 이유는 여기에, 당신은 당신이 설명 된 기능을 만드는 방법을 알고 최종 장치 (cin, out, err, fstream 등)에 연결됩니다. 함수 (수식어가 공상 이름을 가진 모든 함수)는 < < 연산자의 왼쪽에있는 것과는 아무 관계가없는 새로운 ostream을 반환해야하거나 매우 못생긴 메커니즘을 통해 ostream이 무엇인지 알아 내야합니다 다른 것과 연결하면 수정 자의 오른쪽에있는 모든 것이 최종 장치로 전달되지 않지만 오히려 함수/수정자가 반환 한 모든 ostream으로 전송됩니다. 이
cout << "something here" << tab << "something else"<< endl;
같은 스트림의
생각해 정말 괄호의 각 세트는 뭔가 다음 (, 쓰기 등 수정)를 법원 및합니까
(((cout << "something here") << tab) << "something else") << endl);
괄호의 cout을 그래서 다음 집합을 반환 의미 그것으로 작업 할 수 있습니다.
탭 수정 자/기능이 ostream을 참조하지 않은 경우 < < 운영자가 해당 작업을 수행하는 데 ostream이 무엇이 었는지 추측해야합니다. 법정에서 일 했니, 세르, 파일 스트림 ..? 함수의 내부는 정보가 전달되지 않는 한 절대로 알 수 없습니다. 어떻게 정보를 전달했는지, 왜 그렇게 간단하지 않은가? 이제
정말 이제
ENDL 정말 무엇인지 살펴 보자하고있는 점 가정을 구동하기 위해 우리가 사용하고있는 < < 연산자의 버전을 오버로드 :
이 연산자는 다음과 같습니다
:
ostream& ostream::operator<<(ostream& (*m)(ostream&))
{
return (*m)(*this);
}
ENDL은 다음과 같습니다
는
ostream& endl(ostream& os)
{
os << '\n';
os.flush();
return os;
}
ENDL의 목적은 newli을 추가하는 것입니다 스트림의 내부 버퍼의 모든 내용이 장치에 기록되었는지 확인하면서 스트림을 플러시합니다. 이렇게하기 위해서는 먼저이 스트림에 '\ n'을 써야합니다. 그런 다음 스트림을 플러시하도록 지시해야합니다. endl이 쓰기 및 스트림 할 스트림을 알 수있는 유일한 방법은 호출자가 endl 함수를 호출 할 때 해당 정보를 전달하는 것입니다. 그것은 내 차를 씻으라고 말하는 것과 같지만 어느 차가 내 전체 주차장에 있는지는 알려주지 않습니다. 당신은 결코 당신의 일을 끝낼 수 없을 것입니다. 내 차를 내게 주거나 나 스스로 씻을 수 있어야한다.
나는 그
PS 물건을 정리할 희망 - 당신이 실수로 내 차를 찾기 위해 일어날 경우, 그것을 씻어주세요.
마지막 단락에서 질문을 명확하게 할 수 있습니까? 나는 네가 의미하는 것을 이해하지 못한다. –
내 말은 만약 당신이 cout << hex << a << b << endl << c; 모든 숫자는 헥스베이스로 표시됩니다. 그러나 만약 내가 cout << 'a'<< tab << 'b'<< 'c'<< endl로 쓰면 "tab"은 오직 'b ',하지만'c '는 아닙니다. – Narek
@Narek :'tab'에 대한 정의는 탭을 인쇄하고'hex'처럼 스트림 설정을 변경하지 않습니다. –