..

Search

49) 디폴트 생성자

49) 디폴트 생성자

디폴트 생성자


디폴트 생성자(default constructor)

디폴트 생성자는 객체가 생성될 때 사용자가 초깃값을 명시하지 않으면, 컴파일러가 자동으로 제공하는 생성자입니다.

디폴트 생성자는 사용자로부터 인수를 전달받지 않으므로, 매개변수를 가지지 않습니다.

매개변수를 가지지 않으므로 대부분의 디폴트 생성자가 0이나 NULL, 빈 문자열 등으로 초기화를 진행합니다.

 

컴파일러가 제공하는 디폴트 생성자의 원형은 다음과 같습니다.

원형

Book::Book() { }

 

디폴트 생성자는 클래스에 생성자가 단 하나도 정의되지 않았을 때만, 컴파일러에 의해 자동으로 제공됩니다.

만약 사용자가 생성자를 단 하나라도 정의했다면, 위와 같은 객체의 선언은 오류를 발생시킬 것입니다.

따라서 위와 같이 초깃값을 명시하지 않고 객체를 생성하고 싶다면, 사용자가 직접 디폴트 생성자를 정의해야 합니다.


디폴트 생성자의 정의

C++에서 사용자가 직접 디폴트 생성자를 정의하는 방법은 다음과 같습니다.

 

1. 함수 오버로딩을 이용한 방법

2. 디폴트 인수를 이용한 방법


디폴트 인수를 이용한 디폴트 생성자의 정의

C++에서는 기존 생성자의 모든 인수에 디폴트 인수를 명시함으로써 디폴트 생성자를 정의할 수 있습니다.

 

예제

Book::Book(const string& title = "웹 프로그래밍", int total_page = "100");

 

위의 예제처럼 모든 인수에 디폴트 값을 명시하면, 인수를 전달하지 않고도 객체를 생성할 수 있는 디폴트 생성자가 됩니다.


함수 오버로딩를 이용한 디폴트 생성자의 정의

C++에서는 함수 오버로딩을 이용하여 매개변수를 가지지 않는 또 하나의 생성자를 정의할 수 있습니다.

예제

Book();

 

클래스는 단 하나의 디폴트 생성자만을 가질 수 있으므로, 둘 중 한 가지 방법으로만 디폴트 생성자를 정의해야 합니다.

디폴트 생성자를 가지는 객체의 선언

C++에서 디폴트 생성자를 가지는 객체는 다음과 같이 여러 가지 방법으로 선언할 수 있습니다.

예제

1. Book web_book;             // 디폴트 생성자의 암시적 호출

2. Book web_book = Book();    // 디폴트 생성자의 명시적 호출

3. Book *ptr_book = new Book; // 디폴트 생성자의 암시적 호출

 

예제

int main(void)

{

    Book web_book; // 디폴트 생성자의 암시적 호출

    // 생성자가 호출되어 멤버 변수인 percent_가 초기화되었는지를 확인함.

    cout << web_book.percent_;

    return 0;

}

 

Book::Book(const string& title, int total_page)

{

    title_ = title;

    total_page_ = total_page;

    current_page_ = 0;

    set_percent();

}

 

void Book::set_percent()

{

    percent_ = (double) current_page_ / total_page_ * 100;

}

코딩연습 ▶

실행 결과

0

 

하지만 다음과 같은 구문은 컴파일러가 객체의 선언이 아닌 함수의 호출로 보고 오류를 발생시킬 것입니다.

예제

Book web_book();

 

디폴트 생성자를 암시적으로 호출하고 싶을 때에는 괄호(())를 사용해서는 안 됩니다.

연습문제