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

조회수 31496회

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

소스코드

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

2 답변

  • 좋아요

    5

    싫어요
    채택 취소하기

    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); // 에러
    }
    
    
    • 좋은 글 감사합니다. 에러를 고치려면 printM_foo(num)을 printM_foo(new Foo(num)); 로 변경하면 되겠군요? 알 수 없는 사용자 2018.11.2 14:23
  • void printM_Foo ( Foo foo ) 선언문에서 43을 인자로 받으면 Foo foo = 43 이 되고, Foo foo(43) 이 되면서 임시객체가 생성되는 것 아닌가여

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)