1 minute read

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
    • 오버로딩, 디폴트 설정 불가

Tags: ,

Categories:

Updated: