본문 바로가기
개발/C++ (98,03,11,14,17,20,23)

Classic C++ : 1인수 생성자

by snowoods 2025. 11. 15.

Classic C++

1인수 생성자

 

개요

하나의 인수를 갖는 생성자의 역할과 이를 이용한 암시적 형 변환에 대해 알아봅니다.

C++ 버전별 주요 키워드 도입 시기

  • C++98 이전: 1인수 생성자를 통한 암시적 형 변환은 초기 C++부터 지원되었습니다.
  • C++11: explicit 키워드의 기능이 확장되어 명시적 형 변환을 더 유연하게 제어할 수 있게 되었습니다.

 

내용 설명

  • 1인수 생성자는 한 클래스의 객체를 다른 클래스(또는 다른 데이터 타입)의 것으로 변환할 때 많이 사용합니다. 즉, 변환 가능한 클래스를 만들고자 할 경우 1인수 생성자를 주로 사용합니다.
  • ClassA CA = IntNum; 과 같은 형태의 초기화는 ClassA CA(IntNum); 와 동일하게 1인수 생성자를 호출합니다. 이때 =는 대입 연산자가 아닙니다.
  • 주의사항: 생성자 초기화 목록에서 배열을 직접 초기화할 수는 없습니다. strcpy()와 같은 함수를 사용하여 배열의 원소를 하나씩 복사해야 합니다.

 

예제 코드

#include <iostream.h>
#include <string.h>
#include <conio.h>
#pragma hdrstop

const int MAX = 80;

class xString
{
private:
    char str[MAX];
public: // 생성자
    xString(){
        strcpy( str, "" );      // NULL 문자열로 초기화( 모든 값에 NULL 대입 )
    }

    xString( char s[] ){
        strcpy( str, s );       // 인수 문자열로 초기화
    }

public: // 멤버 함수
    void input(){
        cin.get( str, MAX );
    }

    void display(){
        cout << str;
    }

    void append( xString xs ){  // 인수 문자열을 덧붙임
        if( strlen( str ) + strlen( xs.str ) < MAX - 1 )
            strcat( str, xs.str );
        else
            cout << "\nError : xString too long" << endl;
    }
};

#pragma argsused
void main()
{

    xString s2, s3;
    xString s1( "Greetings, " );

    cout << "Enter your name : ";
    s2.input();

    s1.append( s2 );
    s3 = s1;                        // 객체 간 대입
    s3.display();

    getch();

}

 

실행 결과

Enter your name : Lezo
Greetings, Lezo

 

활용팁

  • 1인수 생성자로 인한 원치 않는 암시적 형 변환을 막고 싶다면 생성자 앞에 explicit 키워드를 붙여주세요. explicit 생성자는 ClassA CA(IntNum); 와 같은 직접 초기화 구문으로만 호출할 수 있습니다.