關於cin能識別輸入的資料型別(過載操作符&型別轉換)

licup123發表於2009-01-06
#include 
using std::cin;
using std::cout;
int main()
{
    int i;
    cin>>i;
    if(cin) //cin是如何知道你輸入的是否符合i的型別
        cout<    else
        cout<    return 0;
}

cin是istream物件,istream繼承自ios,ios繼承自ios_base。不要忘記C++的型別轉換,可以隱式的向上型別轉換,一個類的型別也可以轉換成需要的簡單型別(類中定義轉換簡單型別的函式),需要的時候編譯器會知道呼叫他,條件判斷無非是bool型別或者可以轉化成bool型別的型別。
basic_ios裡面定義了一個成員函式,可以轉化成void*指標,void*指標可以轉化成bool型別,if(cin)呼叫過程就是呼叫這個函式operator void *() const;
如果if(!cin)則是呼叫另外一個成員函式bool operator !() const;


如果你問cin為何能識別輸入型別,那是靠過載>>來識別的。

下面的是關於>>的過載成員函式:
istream& operator>> (bool& val );
istream& operator>> (short& val );
istream& operator>> (unsigned short& val );
istream& operator>> (int& val );
istream& operator>> (unsigned int& val );
istream& operator>> (long& val );
istream& operator>> (unsigned long& val );
istream& operator>> (float& val );
istream& operator>> (double& val );
istream& operator>> (long double& val );
istream& operator>> (void*& val );
 
istream& operator>> (streambuf* sb );
 
istream& operator>> (istream& ( *pf )(istream&));
istream& operator>> (ios& ( *pf )(ios&));
istream& operator>> (ios_base& ( *pf )(ios_base&));

下面的不是成員函式,而是全域性函式: 
istream& operator>> (istream& is, char& ch );
istream& operator>> (istream& is, signed char& ch );
istream& operator>> (istream& is, unsigned char& ch );
 
istream& operator>> (istream& is, char* str );
istream& operator>> (istream& is, signed char* str );
istream& operator>> (istream& is, unsigned char* str );

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10697500/viewspace-530082/,如需轉載,請註明出處,否則將追究法律責任。

相關文章