operator<<
Bir üye işlev olarak tanımlarsanız , üye olmayan bir işlev kullanmanızdan farklı bir ayrıştırılmış sözdizimi olacaktır operator<<
. Üye olmayan operator<<
, bir üyenin operator<<
tekli operatör olduğu bir ikili operatördür.
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;
}
Öyleyse .... onları gerçekten nasıl çağırırsınız? Operatörler bazı yönlerden tuhaftır, bazı operator<<(...)
şeyleri anlamlandırmak için söz dizimini kafanıza yazmanız için size meydan okuyacağım .
MyObj mo;
mo << std::cout;
mo.operator<<(std::cout);
Veya üye olmayan ikili operatörü çağırmayı deneyebilirsiniz:
MyObj mo;
std::cout << mo;
operator<<(std::cout, mo);
Bu operatörleri üye işlevlerine dönüştürdüğünüzde sezgisel davranmaya zorlama yükümlülüğünüz yoktur, isterseniz operator<<(int)
bazı üye değişkenlerini sola kaydırmayı tanımlayabilirsiniz , kaç tane yorum yaparsanız yapın, insanların biraz hazırlıksız yakalanabileceğini anlayabilirsiniz. yazmak.
Neredeyse son olarak, bir operatör çağrısı için her iki ayrıştırmanın da geçerli olduğu zamanlar olabilir, burada başınız belaya girebilir ve bu konuşmayı erteleyeceğiz.
Son olarak, ikili bir operatör gibi görünmesi gereken bir tekli üye operatörü yazmanın ne kadar garip olabileceğine dikkat edin (çünkü üye operatörleri sanal hale getirebilirsiniz ..... ayrıca bu yolu devretmemeye ve çalıştırmaya çalışmayın .... )
struct MyObj
{
std::ostream& operator<<(std::ostream& os) { os << *this; return os; }
int value = 8;
};
Bu sözdizimi artık birçok kodlayıcıyı rahatsız edecek ...
MyObj mo;
mo << std::cout << "Words words words";
mo.operator<<(std::cout) << "Words words words";
operator<<(mo.operator<<(std::cout), "Words words words");
cout
Buradaki zincirdeki ikinci argümanın nasıl olduğuna dikkat edin .... garip değil mi?