생성자와 소멸자
생성자
디폴트 생성자
- 객체가 되기 위해서는 반드시 하나의 생성자가 호출되어야 한다.
- 생성자를 정의하지 않는 클래스에는
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를 인자로 전달받는 생성자를 호출한다.
- 멤버 이니셜라이저는 멤버변수로 선언된 객체의 생성자 호출에 활용된다.
객체의 생성 과정
- 메모리 공간의 할당
- 이니셜라이저를 이용한 멤버변수(객체)의 초기화
- 생성자의 몸체부분 실행
소멸자
- 클래스의 이름 앞에 ~가 붙은 형태의 이름을 갖는다.
- 반환형이 선언되어 있지 않으며 반환하지 않는다.
- 매개변수는
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;
}
};