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