C + + 의 explicit 키워드

http://www.cnblogs.com/graphics/archive/2010/08/05/1792749.html
C + + 의 explicit 키워드
MSDN 에서 explicit 키워드 에 대한 설명 을 살 펴 보 겠 습 니 다.
This keyword is a declaration specifier that can only be applied to in-class constructor declarations. An explicit constructor cannot take part in implicit conversions. It can only be used to explicitly construct an object.
1. 이 키 워드 는 클래스 내부 의 구조 함수 만 수식 할 수 있 습 니 다.
class A
{
public:
    explicit A(int i):m_i(i){};

private:
    int m_i ;
};

근 데 밑 에 이러 면 안 돼.
class A
{
public:
    A(int i);

private:
    int m_i ;
};

explicit A::A(int i)
{
    m_i = i ;
}

2 이 키 워드 는 암시 적 전환 을 방지 할 수 있다.
C + + 에서 이러한 조작 을 허용 합 니 다. 특정한 유형의 구조 함 수 는 하나의 매개 변수 만 있 습 니 다. 유형 이 T 라 고 가정 하면 T 에서 해당 유형의 대상 으로 의 암시 적 전환 을 할 수 있 습 니 다. 예 를 들 어 아래 류 A 의 구조 함 수 는 하나의 매개 변수 만 있 고 유형 은 int 라면 하나의 int 를 A 류 의 대상 으로 직접 전환 할 수 있 습 니 다. 이런 상황 은 발생 할 수 있 습 니 다.
A 클래스 대상 을 구성 할 때
A 의 대상 을 매개 변수 로 하 는 함수 호출 시
class A
{
public:
    A(int i):m_i(i){};

private:
    int m_i ;
};

void Func(A a)
{
    
}

int main(void)
{
    A a1 = 1 ;    // OK, implicit convert 1 to object of A
    Func(2) ;    // OK, implicit convert 2 to object of A
    getchar() ;
}

불 행 히 도 이런 전환 은 헷 갈 릴 수 있 기 때문에 우 리 는 이러한 전환 을 막 아야 한다. 이것 이 바로 explicit 가 하 는 일이 다. explicit 로 설명 한 구조 함수 로 이런 유형의 전환 을 허용 하지 않 는 다.변환 을 시도 하면 다음 컴 파일 오류 가 발생 합 니 다.
class A
{
public:
    explicit A(int i):m_i(i){};

private:
    int m_i ;
};

void Func(A a)
{
    
}

int main(void)
{
    A a1 = 1 ;    // error C2440: 'initializing' : cannot convert from 'int' to 'A'
    Func(2) ;    // 'Func' : cannot convert parameter 1 from 'int' to 'A'
    getchar() ;
}

좋은 웹페이지 즐겨찾기