Programming | 프로그래밍 언어/C++

생성자, 소멸자, 이니셜라이저, this

gyunnnnnn 2022. 11. 11. 11:43

생성자와 소멸자

생성자

  • 클래스의 이름과 동일
  • 반환형이 선언되어 있지 않으며 반환하지 않는다.
  • 객체 생성 시 한 번 호출된다.
  • 생성자도 오버로딩이 가능하다.
  • 생성자도 디폴트 값을 설정할 수 있다.
    class Point
    {
    private:
      int xpos;
      int ypos;
    public:
      // 생성자
      Point(int x, int y)
      {
          xpos=x;
          ypos=y;
      }
    };

디폴트 생성자

  • 객체가 되기 위해서는 반드시 하나의 생성자가 호출되어야 한다.
  • 생성자를 정의하지 않는 클래스에는 C++ 컴파일러에 의해서 디폴트 생성자라는 것이 자동으로 삽입된다.
  • 이미 선언한 생성자가 있다면 디폴트 생성자는 삽입되지 않는다.
class A
{
private:
    int num;
public:
    AAA(){} // 디폴트 생성자. 선언하지 않아도 자동으로 삽입된다.
    int GetNum{return num};
};

private 생성자

  • 객체의 생성은 클래스의 외부에서 진행되기 때문에 생성자는 public으로 선언되어야 한다.
  • 클래스 내부에서만 객체의 생성을 허용하려는 목적으로 생성자를 private으로 선언하기도 한다.

이니셜라이저

  • 이니셜라이저를 이용하면 선언과 동시에 초기화가 이뤄지는 형태로 바이너리 코드가 생성된다.
  • 성능의 약간의 이점이 있다.
  • const 멤버변수도 이니셜라이저를 이용하면 초기화가 가능하다.
  • 초기화 대상을 명확하게 인식할 수 있다.

멤버 이니셜라이저

class Rectangle
{
private:
    // Rectangle 클래스의 멤버변수로 선언된 Point 객체
    Point upLeft;
    Point lowRight;
public:
    Rectangle(const int &x1, const int &y1, const int &x2, const int &y2) 
     : upLeft(x1, y1), lowRight(x2, y2) {} // 멤버 이니셜 라이저
};
  • 객체 upLeft의 생성과정에서 x1과 y1을 인자로 전달받는 생성자를 호출한다.
  • 객체 lowRight의 생성과정에서 x2와 y2를 인자로 전달받는 생성자를 호출한다.
  • 멤버 이니셜라이저는 멤버변수로 선언된 객체의 생성자 호출에 활용된다.

객체의 생성 과정

  1. 메모리 공간의 할당
  2. 이니셜라이저를 이용한 멤버변수(객체)의 초기화
  3. 생성자의 몸체부분 실행

소멸자

  • 클래스의 이름 앞에 ~가 붙은 형태의 이름을 갖는다.
  • 반환형이 선언되어 있지 않으며 반환하지 않는다.
  • 매개변수는 void형으로 선언되어야 하기 때문에 오버로딩, 디폴트 값 설정이 불가능하다.
  • 생성자에서 할당한 리소스의 소멸에 사용된다.
class A
{
private:
    int num;
public:
    AAA(){}
    ~AAA(){}
    int GetNum{return num};
};

클래스와 배열

객체 배열

SoSimple arr[10]; // 객체 기반의 배열의 선언
SoSimple * ptrArr = new SoSimple[10]; // 동적으로 할당하는 경우
  • 배열을 선언하는 경우에도 생성자는 호출이 되지만 호출할 생성자를 별도로 명시하지 못한다.
  • 다른 형태로 생성자를 정의했다면, 기본 형태의 생성자 또한 반드시 정의되어 있어야 한다.

객체 포인터 배열

SoSimple * arr[3];
arr[0]->func();
arr[1]->func();
arr[2]->func();
  • 객체의 주소 값 저장이 가능한 포인터 변수로 이뤄진 배열

this 포인터

  • 객체 자신을 가리키는 용도로 사용되는 포인터.
  • this를 사용하면 매개변수의 이름멤버변수의 이름과 같게 쓸 수 있다.
class Point
{
private:
    int xpos;
    int ypos;
public:
    Point(int xpos, int ypos)
    {
        // this를 통해 매개변수의 이름을 멤버변수의 이름과 같게 사용가능
        this->xpos=xpos;
        this->ypos=ypos;
    }
};

'Programming | 프로그래밍 언어 > C++' 카테고리의 다른 글

C++ STL 벡터, 리스트, 덱 비교  (0) 2022.11.18
복사 생성자  (0) 2022.11.13
캡슐화와 const 함수  (0) 2022.11.10
구조체, 클래스, 접근제어지시자  (0) 2022.11.10
C언어 기반의 C++ 2  (0) 2022.11.09