본문 바로가기

C++ Programing

클래스(class) - 생성자, 소멸자

생성자

 

c++에서 클래스를 통해 객체를 생성할 때 자동으로 실행되는 생성자(constructor)라는 특별한 멤버 함수를 통해 객체를 초기화 한다.

한 클래스에서 여러 개의 생성자를 둘 수 있으나, 이중 하나만 실행된다.

 

생성자의 특징은 다음과 같다.

 

1. 생성자 함수는 오직 한 번만 실행된다.

 

2. 생성자 함수의 이름은 클래스 이름과 동일하게 작성한다.

 

3. 생성자 함수의 원형에 리턴타입을 선언하지 않는다. 

 

4. 생성자는 중복이 가능하다.

 

5. 클래스에서 생성자를 만들지 않았을 경우 컴파일러가 기본 생성자를 만들어 삽입하고, 자신이 삽입한 기본 생성자를 호출한다.

 

코드 구현

class Person
{
    private:
        LQueue_Struct questionQueue;

        PERSON_CONDITION condition;
        PERSON_STATE state;
        MBTI_INFO MBTI;
        string myName;
        int IQ;
        int age;
        int salary;
        int company;
        int workTime;
        int sleepTime;
        int gradCard(school_info sch);

    public:
        Person();
        Person(string arg_name, int arg_age);
        ~Person();

        err_t recv_question(question_info qst);
        err_t trans_question(question_info qst, Person who);
        err_t what_doing();
        err_t what_todo();
};

앞서 생성한 코드에서 private와 public 메서드를 좀더 추가 했다.

public에서 person(), person(string arg_name, int arg_age) 함수가 생성자 함수이다.

person이라는 클래스를 통해 객체를 생성할 때 기본적으로 person()을 호출 하지만 만약 매개변수 string arg_name, int arg_age로 만든다면 person(string arg_name, int arg_age)를 호출한다.

 

예시 코드

Person:: Person()
{
    myName = "UNKNOWN";
    age = 99;
    cout << "Who Are you ... ?" << "\r\n";
    cout <<  "Tracking: "<< myName << " age: "<< age <<"\r\n";
}

Person:: Person(string name, int age)
{
    LQueue_init(&questionQueue);
    myName = name;
    this->age = age;
    state = RESTING;
    cout << "Congratulation !! " << myName << " is Come Back !! " << "\r\n";
    cout << "State : " << State_List[state].state_str << "\r\n";
    cout << "age : " << age << "\r\n";

}

Person 객체를 생성 할 때 매개변수가 없으면 myname변수에  UNKNOWN으로 저장하고, 매개변수가 있을 경우 저장하도록 만들었다.

 

소멸자

 

소멸자는 생성자와 반대로 객체가 소멸 시 소멸자 함수가 실행 된다.

소멸자의 특징은 다음과 같다.

 

1. 소멸자의 목적은 객체가 사라질 때 필요한 마무리 작업을 위함이다. ( 동적할당 반환 등)

 

2. 소멸자의 이름은 클래스 이름 앞에 ~를 붙인다.

 

3. 소멸자는 리턴타입이 없다.

 

4. 소멸자는 오직 한개만 존재 하며 매개변수를 가지지 않는다.

 

예시 코드

Person:: ~Person()
{
    cout << myName << " is run away ..." << "\r\n";
    cout << myName << " Will be back ... " << " \r\n";
}

 

 

다음 코드를 실행 하여 어떻게 동작하는지 확인 하였다.

int main()
{
    Person *Human = new Person(); //person() 실행
    Person *Hyojin = new Person("hyojin Park", 33); //person(string name, int age) 실행
    Person *Jitae = new Person("jitae Kim", 33); //person(string name, int age) 실행

    Human->what_doing();
    Hyojin->what_doing();
    Jitae->what_doing();

    delete Hyojin; // 소멸자 실행
    delete Jitae; // 소멸자 실행
    delete Human; // 소멸자 실행

    return 0;
}

 

실행 결과

'C++ Programing' 카테고리의 다른 글

클래스(Class) - 객체 생성  (0) 2023.04.03
cin, cout and namespace  (0) 2023.04.02