클래스 생성자는 기본 생성자, 복사 생성자 그리고 기타 생성자가 있다. 기타 생성자 중에서 암시적 형 변환을 수행하는 생성자를 타입 변환 생성자라고 한다.
변수의 타입 변환은 명시적, 암시적으로 발생한다.
// 암시적 형변환 -> 컴파일러가 암시적으로 형변환을 수행
int num = 1;
double dNum = num; // -> 명시적으로 형 변환을 수행하지 않아도 자동으로 형 변환
// 명시적 형 변환 -> 직접 변환 할 타입을 명시적으로 적는다
float fNum = (float) num; // -> int 타입의 변수를 명시적으로 float 타입으로 변환
위의 예시와 같이 형변환을 명시적, 암시적으로 수행 할 수 있다.
클래스의 생성자들 중에서 인자가 하나인 생성자를 생성한다면, 이는 타입 변환 생성자가 될 수 있다. 이러한 생성자가 타입 변환 생성자로 불리는 이유는 아래의 예시를 통해서 확인 할 수 있다.
class NumClass{
public:
int _num;
NumClass(int num){
_num = num;
}
}
int main(){
NumClass numClass;
numClass = 1; // -> 타입 변환 생성자를 통한 형변환
}
위의 예시에서 NumClass를 대입연산을 통해 초기화 하고 있는데, 이때, NumClass의 타입 변환 생성자가 암시적으로 호출되어서 클래스를 초기화 하게 된다. 이렇게 암시적인 형변환을 통해서 클래스를 초기화 해줄수 있는 생성자를 타입 변환 생성자라고 한다.
하지만, 이러한 암시적 형변환이 의도하지 않은 동작을 일으킬수 있는데, 이를 방지하기 위해서 해당 함수를 반드시 명시적으로만 사용하라는 키워드를 함수에 추가할 수 있다.
class NumClass{
public:
int _num;
explicit NumClass(int num){ // 명시적으로만 사용 가능
_num = num;
}
}
int main(){
NumClass numClass;
numClass = 1; // -> 타입 변환 생성자를 통한 형변환 - 암시적 형변환이므로 오류 발생
numClass = (NumClass) 1; // -> 명시적으로 형변환을 진행하므로 오류가 발생하지 않는다
}