>>運算符返回的是流對象的引用,那麼題目就變成了 while(cin); html
這好像有點奇怪,上網找了答案ios
這是地址點擊打開連接c#
如下是複製過來的內容,不是本人原創:函數
今天看書的時候看到代碼while(cin>>val),突然就在想這樣寫的合法性是如何斷定的。咱們都知道cin是一個流對象,而>>運算符返回左邊的流對象,也就是說cin>>val返回cin,因而while(cin>>val)就變成了while(cin),問題就變成了一個流對象在判斷語句中的合法性。this
無論是while(cin)仍是if(cin),都是合法的,爲何呢?咱們本身定義一個類,而後定義該類的對象,而後使用if語句來判斷它是不合法的。這說明,流對象具備某種轉換函數,能夠將一個流對象轉換成判斷語句能夠識別的類型。spa
通過在網上的搜索查詢發現,流對象確實存在這樣的轉換。code
打開iostream.h文件,找到cin的定義,發現是來自於istream.h,其中的模板類basic_istream繼承自basic_ios,打開basic_ios的定義,發現它繼承自ios_base,再次定位到ios_base類,發現它有兩個重載函數。operator void *() const和bool operator!() const。這兩個函數使得流對象可做爲判斷語句的內容。(參考網頁)htm
operator void *() const;函數在while(cin)或是if(cin)時被調用,將流對象轉換成void*類型。對象
bool operator!() const;函數在while(!cin)或是if(!cin)時被調用,將流對象轉換成bool類型。blog
須要指出的是,上述兩個類型轉換都是隱式的。
既然咱們找到了while(cin)合法的緣由,天然須要試驗一下。
咱們定義一個類A,在A中定義上述兩個函數,而後定義A的一個對象a,使用if(a)和if(!a)來驗證一下。代碼以下:
#include<iostream> using namespace std; class A { public: A() {} ~A() {} operator void* () const { cout << "cast to void*; "; return (void *)this; } bool operator ! () const { cout << "cast to bool; "; return true; } }; int main() { A a; if (a) cout << "first" << endl; if (!a) cout << "second" << endl; return 0; }
運行以上程序,結果爲cast to void*; first和cast to bool; second。
結果代表,if(a)隱式調用了operator void* ()函數,if(!a)隱式調用了bool operator ! ()函數。
上述兩個函數實際上是操做符的重載過程。使用這種重載函數,咱們就能夠像使用cin同樣,用if語句對咱們的對象作判斷了。