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

Classic C++ : 기본 생성자와 2인수 생성자

by snowoods 2025. 11. 14.

Classic C++

기본 생성자와 2인수 생성자

 

개요

인수가 없는 생성자(무인수 생성자, 기본 생성자)와 2개의 인수를 갖는 생성자에 대해 알아보고, 초기화 목록을 사용한 멤버 변수 초기화 방법을 학습합니다.

 

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

  • C++98 이전: 생성자 오버로딩, 초기화 목록(Initializer Lists)은 초기 C++부터 지원되었습니다.

 

내용 설명

1. 기본 생성자(무인수 생성자)?

Class에 생성자를 명시적으로 선언하지 않았을 경우 컴파일러는 무인수 생성자를 자동으로 만듭니다. 이를 기본 생성자라 합니다.
즉, 인수가 없는 생성자를 기본생성자라 합니다.
어떤 종류의 생성자를 명시적으로 선언하고 나면 생성자를 조작할 책임은 프로그래머에게 있습니다.

2. 2인수 생성자?

인수를 가진 생성자는 다양한 종류로 사용이 가능하나 가장 일반적으로 Class의 초기화에 가장많이 사용됩니다.

Class를 초기화 할때는 초기화 목록을 사용합니다.
초기화 목록이란? 생성자의 이름 뒤에 콜론이 오고 그 뒤에 초기화할 변수들(둘 이상이면 쉼표로 분리)이 나열됩니다. 목록의 각 변수를 초기화하는데 사용하는 값은 변수이름 뒤에 소괄호로 묶어서 넣습니다.

class Base
{
private:
    int top;
    int bottom;
public:
    Base() : top(-1), bottom(-1) {}
};

 

예제 코드

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

class BaseTime
{

private:
    int hours;      // 0 ~ 23
    int minutes;    // 0 ~ 59

public:

    BaseTime() : hours( 0 ), minutes( 0 ) {                // 무인수 Constructor
        cout << "I am the constructor0" << endl;
    }

    BaseTime( int h, int m ) : hours( h ), minutes( m ) {  // 2 인수 Constructor
        cout << "I am the constructor2" << endl;
    }

    void Display(){
        cout << hours << ':' << minutes << endl;
    }

    ~BaseTime(){    // Destructor
        cout << "I am the destructor" << endl;
    }

};

#pragma argsused
void main()
{
    cout << "Starting main() function" << endl << endl;

    BaseTime *B1 = new BaseTime();
    BaseTime *B2 = new BaseTime( 3, 20 );
    BaseTime *B3 = new BaseTime( 4, 30 );

    cout << endl;
    B1->Display();
    B2->Display();
    B3->Display();
    cout << endl;

    delete B1;
    delete B2;
    delete B3;

    cout << endl << "Ending main() function" << endl;

    getch();

}

 

실행 결과

Starting main() function

I am the constructor0
I am the constructor2
I am the constructor2

0:0
3:20
4:30

I am the destructor
I am the destructor
I am the destructor

Ending main() function

 

활용팁

  • 초기화 목록을 사용하면 생성자 본문에서 대입 연산을 하는 것보다 효율적입니다. 특히, const 멤버나 참조 멤버는 반드시 초기화 목록을 통해 초기화해야 합니다.
  • 클래스에 여러 생성자를 오버로딩하여 다양한 방법으로 객체를 생성하고 초기화할 수 있습니다.
  • pragma hdrstop 참고 자료 (http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=106)