Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 변환 생성자(Converting Constructor)란? 개념과 예제 완벽 정리


이 글에서는 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); // 암시적 변환 금지
};