생성자(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 형으로 선언되어야 하므로 오버로딩, 디폴트 값 설정도 불가능하다.

 

 

 

 

 

 

 

admin