2013-03-15 52 views
1

我重載I/O操作符:C++如何確定重載運算符的參數?

struct Time { 
    int hours; 
    int minutes; 
}; 

ostream &operator << (ostream &os, Time &t) { 
    os << setfill('0') << setw(2) << t.hours; 
    os << ":"; 
    os << setfill('0') << setw(2) << t.minutes; 
    return os; 
} 

istream &operator >> (istream &is, Time &t) { 
    is >> t.hours; 
    is.ignore(1, ':'); 
    is >> t.minutes; 
    return is; 
} 

我想知道我什麼時候叫cin >> time如何編譯確定is &is說法。這裏是我的main()程序:

operator>>(cin, time); 
cout << time << endl; 

cin >> (cin , time); 
cout << time << endl; 

cin >> time;      //Where is cin argument??? 
cout << time << endl; 

回答

4
cin >> time; 

這是運營商>>有兩個操作數。如果重載操作符函數被發現爲非成員,則左操作數成爲第一個參數,右操作數成爲第二個參數。因此,它變成了:

operator>>(cin, time); 

所以cin說法僅僅是第一個操作數的運算符。

參見標準的§13.5.2:

二元運算應由非靜態成員函數(9.3)帶有一個參數或通過使用兩個參數的非成員函數被實現。因此,對於任何二進制運算符@[email protected]可以被解釋爲​​或[email protected](x,y)

如果你想知道如何適用於經營鏈,藉此:

cin >> time >> something; 

這相當於:

(cin >> time) >> something; 

這也等同於:

operator>>(operator>>(cin, time), something); 
+0

太棒了!謝謝你,@sftrabbit :-) – 2013-03-15 10:00:17

+0

@MarkGarcia:完成。 – 2013-03-15 10:05:18