Jika Anda mendefinisikan operator<<
sebagai fungsi anggota, itu akan memiliki sintaks terdekomposisi yang berbeda dibandingkan jika Anda menggunakan non-anggota operator<<
. Seorang non-anggota operator<<
adalah operator biner, di mana anggota operator<<
adalah operator unary.
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;
}
Jadi .... bagaimana Anda benar-benar memanggil mereka? Operator itu aneh dalam beberapa hal, saya akan menantang Anda untuk menulis operator<<(...)
sintaks di kepala Anda untuk membuat semuanya masuk akal.
MyObj mo;
mo << std::cout;
mo.operator<<(std::cout);
Atau Anda dapat mencoba menelepon operator biner non-anggota:
MyObj mo;
std::cout << mo;
operator<<(std::cout, mo);
Anda tidak memiliki kewajiban untuk membuat operator ini berperilaku secara intuitif saat Anda menjadikannya sebagai fungsi anggota, Anda dapat menentukan operator<<(int)
shift kiri beberapa variabel anggota jika Anda mau, memahami bahwa orang mungkin sedikit lengah, tidak peduli berapa banyak komentar Anda. menulis.
Hampir terakhir, mungkin ada saat di mana kedua dekomposisi untuk panggilan operator valid, Anda mungkin mendapat masalah di sini dan kami akan menunda percakapan itu.
Terakhir, perhatikan betapa anehnya menulis operator anggota unary yang seharusnya terlihat seperti operator biner (karena Anda dapat menjadikan operator anggota virtual ..... juga berusaha untuk tidak berpindah dan menjalankan jalur ini .... )
struct MyObj
{
std::ostream& operator<<(std::ostream& os) { os << *this; return os; }
int value = 8;
};
Sintaks ini akan mengganggu banyak pembuat kode sekarang ....
MyObj mo;
mo << std::cout << "Words words words";
mo.operator<<(std::cout) << "Words words words";
operator<<(mo.operator<<(std::cout), "Words words words");
Perhatikan bagaimana cout
argumen kedua dalam rantai di sini .... ganjil kan?