[C++] explicit (명시적 생성자 호출)

explicit은 명시적 생성자 호출을 위한 키워드입니다.

이를 반대로 말하면, explicit 키워드를 사용하지 않으면 암시적 생성자 호출이 이루어 진다는 이야기입니다.

 

아래 예제 코드를 살펴 봅시다.

class A
{
public:
    A (int i) : m_i (i) {}
private:
    int m_i;
};

void printA (A a)
{
    cout << a.m_i << endl;
}

int main ()
{
    int i = 10;
    printA(i);
}

 

맨 아래 “main()” 함수 내부에서 “printA()” 함수를 호출합니다.

“printA()” 함수의 인자는 “Class A” 타입이지만, 위 코드에서는 “int” 타입의 변수 i 를 넘기고 있습니다.

int i=10;

printA(i);

 

이럴 경우 컴파일러가 “Class A”의 생성자를 살펴본 후, “int” 타입의 변수 하나를 받는 생성자를 자동으로 호출하게 됩니다.

A (int i) : m_i (i) {};

 

이것을 암시적 생성자 호출이라고 합니다.

 

 

하지만, “explicit” 키워드를 사용하여 명시적 선언을 하면 상황은 달라지게 됩니다.

아래 예제 코드를 살펴 봅시다.

class A
{
public:
    explicit A (int i) : m_i (i) {}
private:
    int m_i;
};

void printA (A a)
{
    cout << a.m_i << endl;
}

int main ()
{
    int i = 10;
    printA(i); // compile error !!
}

 

이번에는 “Class A”의 생성자에 명시적 선언을 하였습니다.

explicit A (int i) : m_i (i) {};

 

이 경우에 “paintA()” 함수에 “int” 타입의 변수를 넣으면 컴파일 에러가 발생합니다.

“int” 타입의 인자 하나를 받는 “Class A”의 생성자는 반드시 명시적으로 기술해야 하기 때문입니다. 그래서 컴파일러가 “int” 타입의 인자를 하나 받는 생성자를 자동으로 호출하지 못합니다. 

 

마치 귀찮은 작업을 강제로 하게 만드는 것 같은 명시적 선언은 왜 사용할까요?

반드시 정확히 기술해야 하는 상황을 위해서 입니다.

컴파일러가 자동으로 생성자를 호출하지 못하도록 해서 향후 발생할 수 있는 에러 상황을 제어할 때 사용됩니다.

 


reference.