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

제가 인터넷을 돌아다니다가 어떤 답변에서 밑에 C++ 코드를 봤는데 이 explicit은 무슨 일을 해주는 건가요?

소스코드

class String {
public:
    explicit String (int n); //allocate n bytes
    String(const char *p); // initialize sobject with string p
};

1답변

  • 좋아요

    2

    싫어요
    채택취소하기

    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); // 에러
    }
    
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.