operator<<
멤버 함수로 정의 하면 비 멤버를 사용한 경우와는 다른 분해 구문을 갖게됩니다 operator<<
. 비 멤버 operator<<
는 멤버 operator<<
가 단항 연산자 인 이항 연산자입니다.
struct MyObj;
std::ostream& operator<<(std::ostream& os, const MyObj& myObj);
struct MyObj
{
MyObj& operator<<(std::ostream& os) { os << *this; return *this; }
int value = 8;
};
std::ostream& operator<<(std::ostream& os, const MyObj& myObj)
{
return os << myObj.value;
}
그래서 .. 진짜 어떻게 부르나요? 연산자는 어떤면 operator<<(...)
에서 이상합니다. 이해를 돕기 위해 머리 속에 구문 을 작성하도록 도전하겠습니다 .
MyObj mo;
mo << std::cout;
mo.operator<<(std::cout);
또는 멤버가 아닌 이항 연산자를 호출 할 수 있습니다.
MyObj mo;
std::cout << mo;
operator<<(std::cout, mo);
이러한 연산자를 멤버 함수로 만들 때 이러한 연산자가 직관적으로 작동하도록 할 의무가 없습니다. operator<<(int)
원하는 경우 일부 멤버 변수를 왼쪽으로 이동하도록 정의 할 수 있습니다. 얼마나 많은 댓글이 있더라도 사람들이 경계를 늦출 수 있음을 이해하십시오. 쓰다.
거의 마지막으로, 교환 원 호출에 대한 두 분해가 모두 유효한 경우가있을 수 있으며 여기에서 문제가 발생할 수 있으며 대화를 연기 할 것입니다.
마지막으로, 이항 연산자처럼 보이는 단항 멤버 연산자를 작성하는 것이 얼마나 이상 할 수 있는지 주목하십시오 (멤버 연산자를 가상으로 만들 수 있습니다 ..... 또한이 경로를 계승하지 않고 실행하려고 시도합니다 .... )
struct MyObj
{
std::ostream& operator<<(std::ostream& os) { os << *this; return os; }
int value = 8;
};
이 구문은 이제 많은 코더를 짜증나게 할 것입니다 ....
MyObj mo;
mo << std::cout << "Words words words";
mo.operator<<(std::cout) << "Words words words";
operator<<(mo.operator<<(std::cout), "Words words words");
cout
여기 체인에서 두 번째 인수가 어떻게되는지 주목 하십시오 .... 이상하지 않습니까?