explicit : 명시적
implicit : 암시적
explicit 키워드는 클래스의 암시적 형변환을 막아줍니다. 그럼 먼저 클래스의 암시적 형변환이 어떻게 구현되는지 부터 알아야합니다
암시적 형변환은 두가지 방법을 통해서 구현할 수 있습니다.
1. 파라미터가 있는 생성자를 구현하면 암시적 형변환이 가능합니다.
2. 캐스팅 오퍼레이터를 오버로딩 하면 암시적 형변환이 가능합니다.
#include <iostream>
class ImplicitInt
{
public:
ImplicitInt()
: iValue(-1)
{
}
//1. 파라미터가 있는 생성자
ImplicitInt(long long Param)
: iValue(static_cast<int>(Param))
{
std::cout << "Constructor that takes long long Argument" << std::endl;
}
//2. 캐스팅 오퍼레이터
operator long long()
{
std::cout << "long long Cast Operator" << std::endl;
return static_cast<long long>(iValue);
}
int iValue;
};
void ImplicitFunc(ImplicitInt Param)
{
int a = 0;
}
int main()
{
long long TestArgument = 10LL;
ImplicitFunc(TestArgument); // LL타입 인자가, ImplicitInt클래스로 암시적 형변환 되었다.
ImplicitInt Test(12LL);
long long TestCasting = Test; // ImplicitInt클래스 변수가, long long 타입으로 암시적 형변환 되었다.
}
암시적 형변환이 일어날 수 있는 생성자나 캐스팅 오퍼레이터 앞에 explicit 키워드를 붙이면, 암시적 형변환을 막을 수 있습니다.
#include <iostream>
class ExplicitInt
{
public:
ExplicitInt()
: iValue(-1)
{
}
//1. 파라미터가 있는 생성자
explicit ExplicitInt(long long Param)
: iValue(static_cast<int>(Param))
{
std::cout << "Constructor that takes long long Argument" << std::endl;
}
//2. 캐스팅 오퍼레이터
explicit operator long long()
{
std::cout << "long long Cast Operator" << std::endl;
return static_cast<long long>(iValue);
}
int iValue;
};
void ExplicitFunc(ExplicitInt Param)
{
int a = 0;
}
int main()
{
long long TestArgument = 10LL;
//ExplicitFunc(TestArgument); 불가능
ExplicitFunc(ExplicitInt(TestArgument)); // 이렇게 써야 함
ExplicitInt TestExPlicit(12LL);
//TestCasting = TestExPlicit; //불가능
TestCasting = static_cast<long long>(TestExPlicit); //명시적으로 캐스팅을 해줘야 함
}