생성자(Constructor)와 소멸자(Destructor)

생성자와 소멸자

main

생성자(Constructor)와 소멸자(Destructor)

생성자

  • 클래스에 선언된 멤버 변수를 은닉화(private) 할 경우 외부 접근으로 **초기화 ** 할 수 없다.
  • 이때 생성자를 통해 초기화 할 수 있다.
  • 모든 객체의 특징은 메모리 할당을 받고 생성자를 호출 한다.
  • 생성자는 함수이고, 클래스 이름과 같은 이름을 가지고, 리턴이 없다.
class counter {
private:
    int cnt = 0;  // 문법 에러
public:
    void sum();
};
  • 위 코드와 같이 클래스에서 바로 초기화 할 수 없음
class counter {
private:
    int cnt;
public:
    counter() // 생성자
    {
        cnt = 0;  // 초기화
    }
    void sum();
};
  • 생성자를 통해 초기화 할 수 있음
class counter {
private:
    int cnt;
public:
    counter(int _cnt) // 생성자
    {
        cnt = _cnt;  // 초기화
    }
    void sum();
};

int main()
{
    counter test(0); // 객체 생성하면서 초기화
    //counter test = counter(0); // 같은 의미
    
    return 0;
}
  • 생성자를 통해 파라메타를 입력받아 초기화도 가능
class counter {
private:
    int cnt;
public:
    counter() // 디폴트 생성자
    {
        cnt = 0;
    }
    counter(int _cnt) // 오버로딩 생성자
    {
        cnt = _cnt;
    }
    void sum();
};

int main()
{
    counter test(0); // 객체 생성하면서 초기화
    
    return 0;
}
  • 생성자도 오버로딩이 가능하다.
  • 디폴트 생성자는 인자값을 받지 않는다.
class counter {
private:
    int cnt;
public:
    counter(int _cnt = 0) // 디폴트 매개변수
    {
        cnt = _cnt;
    }
    void sum();
};

int main()
{
    counter test(0); // 객체 생성하면서 초기화
    
    return 0;
}
  • 디폴트 매개변수 를 사용하면 다음과 같이 코드를 줄일 수 있다.(디폴트 매개변수는 이전 설명 참조)

소멸자

  • 생성자와 같은 함수이다.
  • 클래스 이름앞에 ~ 가 붙는 형태이다.
  • 리턴타입도 없고, 매개변수도 없고, 오버로딩도 안된다.
class counter {
private:
    int cnt;
public:
    counter() // 생성자
    {
        cnt = 0;
    }
    ~counter(); // 소멸자
  
};

int main()
{
    counter test; // 생성자 호출
    return 0; // 소멸자 호출
}

도움이 되셨다면 더 좋은 정보 공유를 위해 광고 클릭 부탁 드립니다 :)

댓글 쓰기

0 댓글