반응형
변환 생성자는 기본 타입을 이용해서 객체를 생성하는 생성자입니다.
다음 소스 코드를 보도록 하겠습니다.
#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 |