explicit 는 분명한, 명백한이라는 의미가 있다. 이 키워드는 자신이 원하지 않은 형변환이 일어나지 않도록 제한한다. 즉, 묵시적 형변환을 하지 못하도록 막는다.
아래 예시를 보면, explicit
키워드에 C(B const &_)
생성자가 있다. 생성자에 expilict 키워드를 사용한다면 컴파일러가 알아서 형변환 하는것을 막을 수 있다.
f 함수
는 C 클래스
의 객체를 매개변수로 받는다. main
문을 보면 A 클래스
생성자와 B클래스
생성자로 매개 변수로 받는다.
#include <iostream>
class A {};
class B {};
class C {
public:
C(A const &_) { return; }
explicit C(B const &_) { return; }
};
void f(C const &_) { return; }
int main(void) {
f( A() );
f( B() );
return 0;
}
A
는 explicit
키워드가 없어서 묵시적 캐스팅시 성공하는 것을 볼 수 있다. 하지만 위험할 것이다.
B
는 explicit
키워드가 있기 때문에 에러가 출력된다.
explicit 키워드를 사용한다면 사용자가 상황에 맞게 직접 형 변환을 해주어야 한다.
#include <iostream>
class A {};
class B {};
class C {
public:
C(A const &_) { return; }
explicit C(B const &_) { return; }
};
void f(C const &_) { return; }
int main(void) {
f( A() );
f( static_cast<C>( B()) );
return 0;
}
C
로 캐스트하면 문제가 에러가 없어진다.
안전한 형변환이 있어야한다면, explicit 키워드를 사용하자!