생성자(Constructor)와 소멸자(Destructor)
카테고리 없음 2015. 5. 12. 21:17생성자의 이해
- 생성자를 이용하게되면 객체를 생성과 동시에 초기화할 수 있다.
생성자의 특징
- 클래스의 이름과 함수의 이름이 동일
- 반환형이 없고 실제로 반환하지도 않는다.
- 객체 생성시에 딱 한번 호출된다.
- 생성자도 함수의 일종이다. 그래서 오버로딩이 가능하다
- 매개변수에 디폴트값을 설정할 수 있다.
멤버 이니셜라이저를 통한 멤버 초기화
ex)
class Rectangle
{
private:
Point upLeft;
Point lowRight;
public:
Rectangle(const int &x1, const int &y1, const int &x2, const int &y2);
void ShowRecInfo() const;
};
생성자 정의
Rectangle::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. 생성자의 몸체부분 실행
* 생성자는 정의하지 않으면 디폴트 생성자로 호출이 된다.
멤버 이니셜라이즈를 이용한 변수 및 const 상수(변수)초기화
멤버 이니셜라이즈는 객체가 아닌 멤버의 초기화에도 사용된다.
ex)
class SoSimple
{
private:
int num1;
int num2;
public:
SoSimple(int n1, int n2)
: num1(n1)
{
num2 = n2;
}
};
- 생성자의 몸체부분에서 초기화하는 방법, 이니셜라이즈를 통하여 초기화하는 방법 2가지 있음
- 하지만 일반적으로 이니셜라이즈를 통해서 초기화하는 방법을 선호한다.
이유는 1. 초기화의 대상을 명확히 인식할 수 있다.
2. 성능에 약간의 차이가 있다.
* const 멤버 변수도 이니셜라이즈를 통해 초기화가 가능하다.
이니셜라이즈의 특징으로 인하여 멤버변수로 참조자를 선언할 수 있다.
- 이니셜라이즈를 이용하면 참조자도 멤버변수로 선언될 수 있다.
디폴트 생성자(Default Constructor)
- 객체는 메모리 공간의 할당 이후에 생성자의 호출까지 성공해야 완성되었다라고 말할 수 있다.
- 즉, 객체가 되기 위해서는 반드시 하나 이상의 생성자가 호출이 되어야 한다.
- 하지만 생성자를 정의하지 않았다면 c++ 내부에서 디폴트 생성자라는 것이 자동으로 삽입된다.
*** 힙에 할당된 메모리 공간은 변수로 간주하여, 참조자를 통한 참조가 가능하다.
소멸자(Destructor)의 이해
소멸자의 형
- 클래스의 앞에 '~'가 붙은 형태의 이름을 갖는다.
- 반환형이 선언되어 있지 않으며, 실제로 반환하지 않는다.
- 매개변수는 void 형으로 선언되어야 하므로 오버로딩, 디폴트 값 설정도 불가능하다.