Programming/CPP

explicit keyword in C++ (cpp)

Imaspear 2020. 10. 16. 19:47
728x90

 

 

 

 

explicit 키워드를 간단하게 말하자면, 생성자의 역할이 달라지지 않도록 도와주는 역할을 합니다. 

explicit 키워드는 간단하게 생성자 앞에 추가하면 됩니다.  우선 예제를 보도록 하겠습니다.

 

 

 

 

 

실제로 매개변수가 하나인 경우 클래스명을 생략하여 형 변환이 일어나 생성 가능하도록 할 수 있습니다.

 

class CNumber
{
private:
    int x;
public:
    CNumber() : x(0) {};
    CNumber(int a) : x(a){}
};

int main(int argc, char const *argv[])
{
    CNumber N1;
    CNumber N2(1);
    CNumber N3 = CNumber(2);

    // 매개변수가 1개일 경우 클래스명 생략이 가능하다.
    CNumber N4 = 3;

    return 0;
}

 

 

하지만, CNumber(int a) 함수에 explicit 키워드를 붙여 형 변환이 일어나지 않도록 저장했습니다. 

class CNumber
{
private:
    int x;
public:
    CNumber() : x(0) {};
    explicit CNumber(int a) : x(a){}
};

int main(int argc, char const *argv[])
{
    CNumber N1;
    CNumber N2(1);
    CNumber N3 = CNumber(2);

    CNumber N4 = 3;

    return 0;
}

 

 

아래와 같이 오류가 출력됩니다.  

[Running] cd "c:\Users\rjsck\Documents\cpp\cpp5\explicit.cpp\" && g++ explicit_01.cpp -o explicit_01 && "c:\Users\rjsck\Documents\cpp\cpp5\explicit.cpp\"explicit_01
explicit_01.cpp: In function 'int main(int, const char**)':
explicit_01.cpp:19:18: error: conversion from 'int' to non-scalar type 'CNumber' requested
     CNumber N4 = 3;
                  ^

 

explicit 키워드는 묵시적 형변환에 의한 객체 생성을 불가하도록 만듭니다. 

 

실제로 explicit 키워드는 자동 형 변환을 의도하지 않을 경우, 즉 컴파일러가 파라미터 형 변환을 위해 생성자를 호출하는 걸 막아 오류가 발생하는 걸 방지하기 위해 사용합니다.