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


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

소스코드

class String {
public:
    explicit String (int n); //allocate n bytes
    String(const char *p); // initialize sobject with string p
};
  • 2016년 01월 13일에 작성됨

조회수 484


1 답변


좋아요
0
싫어요
채택취소하기

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

  • 2016년 01월 13일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close