while(cin)와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문장으로 우리의 대상을 판단할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.