본문 바로가기

Programming/C&CPP

C++ 변환 생성자(Conversion Constructor)

반응형

변환 생성자는 기본 타입을 이용해서 객체를 생성하는 생성자입니다.

다음 소스 코드를 보도록 하겠습니다.

#include <iostream>
using namespace std;

class Distance
{
private:
	int kilometer, meter;

public:
	Distance() : kilometer(0), meter(0){}
	Distance(int newDist)
	{
		kilometer = newDist / 1000;
		meter = newDist % 1000;
	}
	void PrintDistance()
	{
		cout << "Distance is " << kilometer << "km " << meter << "m\n";
	}
};

int main()
{
	Distance a(2030);

	a.PrintDistance();

	return 0;
}

Distance 클래스에는 int 형을 하나 전달받는 생성자가 존재합니다.

이런 생성자가 바로 변환 생성자입니다.

변환 생성자는 다음과 같이 암시적인 형 변환으로 객체를 생성할 수 있게 합니다.

main 함수를 약간 수정하겠습니다.

int main()
{
	// Distance a(2030);
	Distance a = 2030;

	a.PrintDistance();

	return 0;
}

단순하게 대입 연산자를 통해서 객체를 생성할 수가 있습니다.

이렇게 일반 타입을 객체로 생성하는 방법은 의도하지 않은 문제를 발생시킬 수 있습니다.

DistanceFunc라는 함수를 추가하고 main을 다음과 같이 변경합니다.

void DistanceFunc(Distance d)
{
	d.PrintDistance();
}

int main()
{
	DistanceFunc(2030);

	return 0;
}

변환 생성자가 존재하기 때문에 Distance 타입을 전달받는 함수를 int 값 하나로 실행이 됩니다.

의도치 않게 잘못된 값이 들어갈 경우에도 정상적으로 동작이 됩니다.

그렇기 때문에 문제를 찾기가 어려울 수 있습니다.

이런 방식으로 실행되는 걸 막아주기 위해서 explicit이라는 키워드가 존재합니다.

explicit은 다음과 같이 사용합니다.

explicit Distance(int newDist)
{
		kilometer = newDist / 1000;
		meter = newDist % 1000;
}

변환 생성자의 앞에 explicit을 추가하면 됩니다.

이제 DistanceFunc(2030);은 에러로 처리됩니다.

생성을 할 때도 다음과 같은 형식으로 명시적으로 형 변환을 해줘야합니다.

// Error
// Distance a = 2030;

// OK
Distance a = (Distance)2030;

명시적으로 작성을 한 경우에만 생성이 가능합니다.

변환 생성자를 작성할 때는 항상 explicit 키워드를 사용하시기 바랍니다.

반응형