이 글에서는 C++ 클래스의 변환 생성자(converting constructor)가 무엇인지 자세히 알아보겠습니다. 먼저 생성자는 클래스의 특수한 멤버 함수로, 다음과 같은 고유한 특징을 가집니다.
- 함수 이름이 클래스 이름과 동일하다
- 별도의 반환값을 가지지 않는다
- 객체가 생성될 때 자동으로 호출된다
생성자는 클래스의 객체를 만들기 위해 사용되며, 인수를 받을 수도 있고 받지 않을 수도 있습니다.
변환 생성자란?
생성자가 단 하나의 인수만 받도록 정의되면, 그 생성자를 변환 생성자라고 부릅니다. 변환 생성자는 다른 타입의 값(예: int, double 등)을 해당 클래스의 객체로 자동으로 변환(암시적 변환)할 수 있게 해줍니다.
예를 들어, 정수 하나를 매개변수로 받는 생성자가 있다면, 정수 값을 곧바로 클래스 객체에 대입할 때 컴파일러가 자동으로 이 생성자를 호출해 줍니다.
예제 코드
#include<iostream>
using namespace std;
class my_class {
private:
int my_var;
public:
// 인수를 하나만 받는 생성자 → 변환 생성자
my_class(int x) {
this->my_var = x; // 매개변수 생성자로 my_var 값 설정
}
void display() {
cout << "The value of my_var is: " << my_var << endl;
}
};
int main() {
my_class my_obj(10);
my_obj.display();
my_obj = 50; // 여기서 변환 생성자가 호출됨
my_obj.display();
}실행 결과
The value of my_var is: 10 The value of my_var is: 50
동작 원리
my_obj = 50; 문장이 실행되는 순간, 컴파일러는 내부적으로 my_class(50)이라는 임시 객체를 변환 생성자를 통해 만든 뒤, 그 객체를 my_obj에 대입합니다. 즉, 개발자가 별도의 변환 코드를 작성하지 않아도 정수 50이 자동으로 my_class 객체로 변환되는 것입니다.
참고: explicit 키워드로 암시적 변환 막기
이러한 자동 변환은 편리하지만, 의도하지 않은 버그의 원인이 될 수도 있습니다. 암시적 변환을 막고 싶다면 생성자 선언 앞에 explicit 키워드를 붙이면 됩니다. 이렇게 하면 명시적인 초기화나 캐스팅을 통해서만 객체를 생성할 수 있습니다.
class my_class {
public:
explicit my_class(int x); // 암시적 변환 금지
};