C++의 explicit 키워드는 뭘 하는 건가요?


C++의 explicit 키워드는 뭘 하는 건가요?

C++컴파일러는 함수의 인자로 들어오는 값을 알아서 타입에 맞게 바꿀 수 있습니다.

이게 무슨 뜻인지는 다음의 예제로 설명할게요.



class Foo{
public:
    int m_foo;
    Foo (int foo) : m_foo (foo) {}
};
 
void printM_foo (Foo foo){
    cout << foo.m_foo << endl;
}
 
int main (){
    int num = 43;
    printM_foo(num);
}

결과 : 43

printM_foo(Foo foo)는 Foo 타입의 파라미터 foo를 받아서 foo.m_foo를 출력합니다.
그런데 main()은 지금 Foo 타입이 아닌 int 타입 파라미터를 넘기고 있지요. 심지어 출력도 잘 됩니다.
어떤 식으로 컴파일러가 일하길래 이런 결과가 나타날까요?

printM_foo(num)이 호출되면 컴파일러는 Foo 클래스에서 int를 파라미터로 받는 생성자를 호출해
printM_foo(Foo foo)의 적절한 파라미터 타입인 Foo로 알아서 형 변환을 해줍니다.

explicit 키워드는 이런 상황에서 사용합니다. 자동 형 변환을 의도하지 않은 사용법인 경우, 버그를
야기할 수도 있기 때문에 explicit 키워드를 써서 컴파일러가 파라미터 형 변환을 위해
생성자를 호출하는 것을 막아 버그를 방지할 수 있습니다.

따라서 위 코드의 생성자 앞에 다음과 같이 explicit 을 명시해 주면
explicit Foo (int foo) : m_foo (foo) {}

printM_foo(num); 에서 컴파일러가 에러를 띄워주고 여기서부터는 파라미터 형 변환은 컴파일러가 아닌 프로그래머가 해줘야 합니다.

class Foo{
public:
    int m_foo;
    explicit Foo (int foo) : m_foo (foo) {}
};
 
void printM_foo (Foo foo){
    cout << foo.m_foo << endl;
}
 
int main (){
    int num = 43;
    printM_foo(num); // 에러
}




댓글

Designed by JB FACTORY