C, C++

[C++] 생성자(Constructor)의 개념, 생성자 정의하고 호출하는 다양한 방법들, 생성자 오버로딩, 기본 생성자

깃짱 2024. 4. 24. 20:30
반응형
반응형

 

 

💋 생성자란?

✔️ 개념

  • 객체를 초기화하는 역할을 하는 member function
    • 초기화 = member variables의 값을 초기화
    • 객체 선언 시 자동으로 호출된다.

💋 생성자 코드에서 사용하기

✔️ 생성자 정의

  • 이름은 클래스 이름과 동일하게
  • 반환값은 없음
class Money {
public:
    Money(int dollar, int cent) // 생성자
            : dollar(dollar), cent(cent) {
    }

    int getDollars() const {
        return dollar;
    }

    int getCents() const {
        return cent;
    }

private:
    int dollar;
    int cent;
};

✔️ 생성자 호출

int main() {
    Money money1(4, 2), money2(5, 2); 
}
  • 생성자 자동으로 호출되며 객체가 생성된다.

✔️ 생성자 정의 방법들

1. 클래스 내에서 직접 정의하기

class Money {
public:
    Money(int dollar, int cent){
        this->dollar = dollar;
        this->cent = cent;
    };

    int getDollars() const {
        return dollar;
    }

    int getCents() const {
        return cent;
    }

private:
    int dollar;
    int cent;
};

 

2. class 먼저 정의하고 밖에서 정의하기

class Money {
public:
    Money(int dollar, int cent);

    int getDollars() const {
        return dollar;
    }

    int getCents() const {
        return cent;
    }

private:
    int dollar;
    int cent;
};

Money::Money(int dollar, int cent) {
    this->dollar = dollar;
    this->cent = cent;
}

 

3. Initialization Section에서 정의하기

class Money {
public:
    Money(int dollar, int cent);

    int getDollars() const {
        return dollar;
    }

    int getCents() const {
        return cent;
    }

private:
    int dollar;
    int cent;
};

Money::Money(int dollar, int cent)
        : dollar(dollar), cent(cent) {
}
  • {} 이전에 : 와 함께 정의하면 member 변수에 직접 접근할 수 있어서 좀더 깔쌈하게 정의할 수 있음.

💋 생성자 제대로 사용하기

✔️ 생성자 Overloading

  • overloading
    • 같은 이름의 메서드를 클래스 내에서 여러 번 정의하지만, 매개변수의 타입이나 개수가 다른 경우
    • 메서드 이름만 같고, 매개변수의 리스트가 다르기 때문에 완전히 다른 메서드임!
class DayOfYear {
public:
    DayOfYear(int month, int day);

    DayOfYear(int month); // 생성자 오버로딩

    DayOfYear(); // 생성자 오버로딩 

    void input();

    void output() {
        cout << month << "월 " << day << "일" << endl;
    };

    int getMonth();

    int getDay();

private:
    int month;
    int day;

    void validateDate();
};

int main() {
    DayOfYear date1(4, 16), date2(8, 10), date3(3, 1), date4; // 다양하게 호출 가능
}

✔️ Explicit Constructor Call

int main() {
    DayOfYear date1(4, 16);
    date1 = DayOfYear(5, 5);
}
  • 이렇게 하면 앞서 선언한 4월 16일이 5월 5일로 뒤집어씌워진다.

✔️ 기본 생성자

  • parameter가 하나도 없는 생성자
  • 생성자가 하나도 없으면 컴파일러가 자동으로 생성해주지만, 개발자가 다른 생성자를 정의했다면 자동으로 생성해주지 못하므로 필요하다면 개발자가 직접 작성해 주어야 한다.
int main() {
    DayOfYear date; // 기본 생성자 호출 (없으면 호출 안됨)
}

 

 

도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
비밀댓글과 메일을 통해 오는 개인적인 질문은 받지 않고 있습니다. 꼭 공개댓글로 남겨주세요!

 

반응형