2014-02-11 87 views
5

我從this article得到了一段代碼,我很困惑它是如何工作的?該片段開始說:C++ IO流簡介

則可以檢測到特定的讀或者寫測試讀取的結果失敗的操作。例如,要檢查一個有效的整數從用戶讀取,你可以這樣做:

int x; 
if (cin >> x) 
{ 
    cout << "Please enter a valid number" << endl; 
} 

這工作,因爲讀操作返回流的引用。

我知道cin >> x操作返回對cin的引用,但我仍然對如何評估對標準輸入流對象的引用使您能夠檢查輸入是否爲有效整數感到困惑。

+2

這將是因爲http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool – chris

+5

我不確定代碼做它聲稱的...是否如果條件否定?它應該是什麼? –

+0

@DavidRodríguez-dribeas是的,應該是。這是文章作者的錯誤。 – 0x499602D2

回答

6

cinistream模板類的實例。 operator >>作用於此istream實例以將輸入加載到數據中並返回對此的引用istream。然後在while條件下,通過調用cin::operator void*() const(C++ 11中的explicit operator bool() const)來調用fail()函數來測試操作是否成功。這就是爲什麼你可以在while條件

while (cin >> x) 
{ 
    //... 
3

使用此操作根據文檔(http://www.cplusplus.com/reference/ios/ios/operator_bool/),操作員

explicit operator std::ios::bool() const; 

「返回一個錯誤標誌是否被設置(無論是failbit或badbit)。 「和「如果至少有一個錯誤標誌被設置,則函數返回false,否則返回true。」

因此,當if聲明鑄cinbool,這個操作符返回false如果流有一個錯誤標誌設置,並true否則。

+0

正如@DavidRodríguez指出的那樣,源文章的邏輯顛倒了。您可以仔細檢查文檔和/或爲自己做實驗! – aldo