반응형
변환 생성자는 기본 타입을 이용해서 객체를 생성하는 생성자입니다.
다음 소스 코드를 보도록 하겠습니다.
#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 키워드를 사용하시기 바랍니다.
반응형
'Programming > C&CPP' 카테고리의 다른 글
| 스마트하지 못한 스마트한 포인터 auto_ptr (0) | 2014.12.08 |
|---|---|
| C++ 변환 연산자(Conversion operator) (0) | 2014.12.08 |
| 가변 인자 함수의 사용법(vprintf, vsprintf) (0) | 2014.12.07 |
| 가변 인자(Variable Arguments) 내부 구조 (0) | 2014.12.07 |
| C++의 캐스트(Cast) 연산자 (0) | 2014.12.06 |