หากคุณกำหนดเป็นหน้าที่ของสมาชิกก็จะมีไวยากรณ์ย่อยสลายที่แตกต่างกันกว่าถ้าคุณใช้ที่ไม่ใช่สมาชิก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
อาร์กิวเมนต์ที่สองในห่วงโซ่เป็นอย่างไร .... แปลกใช่มั้ย?