while(cin)와while(!cin)의 원리 분석

2718 단어
오늘 책을 읽다가 코드while(cin>>val)를 봤는데 갑자기 이렇게 쓴 합법성이 어떻게 판정되는지 생각했어요.우리는 cin이 하나의 흐름 대상이라는 것을 알고 있다. 그러나 >>연산자는 왼쪽의 흐름 대상으로 돌아간다. 즉,cin>val은cin으로 돌아간다. 그래서 while(cin>>val)는while(cin)이 되고 문제는 하나의 흐름 대상이 문장의 합법성을 판단하는 것이 된다.
while(cin)나if(cin)나 모두 합법적입니다. 왜요?우리는 스스로 하나의 클래스를 정의한 다음에 그 클래스의 대상을 정의한 다음에if문구를 사용하여 그것이 비합법적이라고 판단한다.이것은 흐름 대상이 어떤 변환 함수를 가지고 있어 하나의 흐름 대상을 판단 문장이 식별할 수 있는 유형으로 변환할 수 있음을 설명한다.
iostream을 엽니다.h 파일,cin의 정의를 찾았습니다.istream에서 온 것을 발견했습니다.h, 템플릿 클래스basicistream은basic 에서 계승ios,basic 열기ios의 정의, ios 에서 계승된 것 발견base, ios 에 다시 위치 지정베이스 클래스, 두 개의 재부팅 함수가 있음을 발견했습니다.operator void * () const 및 bool operator!() const.이 두 함수는 흐름 대상을 판단 문장의 내용으로 삼을 수 있게 한다.
        operator void *() const;함수는while(cin)이나if(cin)에서 호출되며, 흐르는 대상을void* 형식으로 변환합니다.
        bool operator!() const;함수가while (!cin) 이나if (!cin) 에서 호출되어 흐르는 대상을 bool 형식으로 변환합니다.
C++ 중basicios.h의 함수 정의는 다음과 같습니다.
/**
 *  @brief  The quick-and-easy status check.
 *
 *  This allows you to write constructs such as
 *  "if (!a_stream) ..." and "while (a_stream) ..."
*/
operator void*() const
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); }

bool operator!() const
{ return this->fail(); }

따라서 호출 과정은 다음과 같이 간단하게 이해할 수 있다.
               while(cin)  =====> while(!cin.fail())              //while the stream is OK                while(!cin) =====> while(cin.fail())              //while the stream is NOT OK
상술한 두 가지 유형의 전환은 모두 은식이다.
기왕에while(cin)의 합법적인 원인을 찾았으니 당연히 시험해 볼 필요가 있다.
우리는 클래스 A를 정의하고 A에서 상술한 두 함수를 정의한 다음에 A의 대상 a를 정의하고if(a)와if(!a)를 사용하여 검증한다.코드는 다음과 같습니다.
[cpp]  view plain copy
#include  
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"<
    if(!a) cout<<"second"<
    return 0;  
}  
  
이상의 프로그램을 실행한 결과 cast to void*입니다.first 및 cast to bool;second.결과에 따르면if(a)은식으로operatorvoid*() 함수를 호출했고,if(!a)은식으로booloperator를 호출했습니다!() 함수.
상술한 두 함수는 사실 조작부호의 재부팅 과정이다.이런 재부팅 함수를 사용하면 우리는cin을 사용하듯이if문장으로 우리의 대상을 판단할 수 있다.

좋은 웹페이지 즐겨찾기