[열혈 C++] Chap04: 클래스의 완성2 (생성자와 소멸자)
3. 생성자(Constructor)와 소멸자(Destructor)
- 클래스에서는 변수 선언과 초기화를 동시에 못했기 때문에,
Init()
함수를 통해 멤버변수에 접근하여 초기화 했다.
생성자를 만들면 할 수 있다!
✏️생성자
- 클래스의 이름과 동일한 함수
- 반환형 선언X, 리턴값X
객체 생성시 딱 한번 호출된다
- 생성자도 오버로딩 가능
-
생성자도 매개변수에 “디폴트 값” 설정 가능
class SimpleClass{ private: int num1; int num2; public: SimpleClass(){ //생성자 num1 = 0; num2 = 0; } SimpleClass(int n){ //오버로딩 가능 num1 = n; num2 = 0; } SimpleClass(int n1=0, int n2=0){ //디폴트 값 설정 가능 num1 = n1; num2 = n2; } void ShowData() const{ cout << num1 << ' ' << num2 << endl; } }; int main(void){ SimpleClass sc1; //SimpleClass sc1(); (X) 이건 함수 원형을 선언한 것 sc1.ShowData(); SimpleClass sc2(100); sc2.ShowData(); SimpleClass sc3(100,200); sc3.ShowData(); return 0; }
✏️멤버 이니셜라이저
- B클래스 객체를 멤버로 가지고 있는 A클래스 객체를 생성하는 과정에서,
B클래스의 생성자를 통해 B클래스 객체를 초기화 할 수 있다.
class Point { //Point 클래스 private: int x; int y; public: Point(const int &xpos, const int &ypos); int GetX(); int GetY(); bool SetX(); bool SetY(); }; Point::Point(const int &xpos, const int &ypos){ //Point 생성자 x = xpos; y = ypos; } class Rectangle{ //Rectangle 클래스 private: Point upLeft; Point lowRight; public: Rentangle(const int &x1, const int &y1, const int &x2, const int &y2) //Rectangle생성자 :upLeft(x1, y1), lowRight(x2, y2){ //멤버 이니셜라이저 } };
- “객체 upLeft/lowRight의 생성과정에서 x1, y1/x2, y2을 인자로 전달받는 생성자를 호출하라” 는 뜻이 된다.
-
아래 예시처럼 객체가 아닌 멤버변수도 이니셜라이저를 통해 초기화 가능하다.
class SoSimple{ private: int x; int y; public: SoSimple(int n1, int n2) : y = n1 //y를 n1으로 초기화 --> 선언과 동시에 초기화--> 성능이 살짝 더 좋음 { x = n2 } }
- const 멤버변수는 선언과 동시에 초기화 해야한다 여기에도 이니셜라이저를 사용하여 초기화 할 수 있다.
- 참조자도 멤버변수로 선언할 수 있게 해준다.
✏️디폴트 생성자
- 클래스를 정의할 때, 내가 직접 생성자를 만들어주지 않아도,
나중에 객체를 만들때, 디폴트 생성자가 자동으로 호출된다. - malloc으로 객체생성시에는 호출X. 동적으로 객체를 할당하고 싶으면 new사용할 것
✏️생성자 불일치
- 매개변수가 있는 생성자는 디폴트 생성자가 자동으로 삽입되지 못한다.
class SoSimple{ private: int n; public: SoSimple(int num) : num = n{} } //SoSimple sim2; (X) //SoSimple sim1(10); (O)
✏️소멸자
- 객체 소멸시 호출됨
~ClassName()
형태- 반환형 선언x
- 오버로딩, 디폴트 설정 불가
- B클래스 객체를 멤버로 가지고 있는 A클래스 객체를 생성하는 과정에서,