explicit keyword

Min·2024년 7월 14일
0

CPP

목록 보기
13/14
post-thumbnail

explicit

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 keyword를 이용한 암시적 형변환 제한

암시적 형변환이 일어날 수 있는 생성자나 캐스팅 오퍼레이터 앞에 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); //명시적으로 캐스팅을 해줘야 함
}
profile
티내는 청년

0개의 댓글