본문 바로가기
스터디/C++

[ C++ ] 생성자와 소멸자 그리고 멤버 이니셜라이저( Member Initializer )

by 알 수 없는 사용자 2019. 9. 24.

생성자(constructor)는 객체 생성 시 딱 한번 호출된다.

또한 클래스의 이름과 함수의 이름이 동일하고 반환형이 선언되어 있지 않으며, 실제로 반환하지 않는다.

 

또한 생성자도 함수이기에 오버 로딩과 매개변수에 디폴트 값 설정도 가능하다.

 

C++ 생성자 오버로딩

 

C++ 생성자 매개변수 디폴트 값

 

하지만 이렇게 생성자를 통해서 멤버변수를 초기화하는 것은 불편하기에 C++은 멤버 이니셜라이저(Member Initializer)도 지원한다. 

 

멤버(Member)는 클래스 내의 멤버 변수 혹은 멤버 변수를 뜻하고

이니셜 라이저(Initializer)는 초기화라는 뜻이다. 

 

그러면 초기화를 어떻게 하는지 살펴보면

C++ 멤버 이니셜 라이저

이렇게 생성자 함수 뒤에 : 를 붙여서 사용하면 된다.

num(A_num)은 num = A_num과 동일한 의미를 가진다. 

 

"즉, 멤버 이니셜 라이저를 사용하면 초기화의 대상을 명확히 인식이 가능하고, 선언과 동시에 초기화가 이뤄지는 바이너리 코드가 생성되기에 성능에도 이점이 있다."

 

멤버 이니셜라이저를 자주 사용하도록 하자.

 

그럼 여기서 궁금증이 생기는데, 컴파일단에서 선언과 초기화가 동시에 이뤄지면 const 변수도 할당할 수 있지 않을까?

C++ const 멤버 변수 초기화

가능하다. 즉, 객체 생성 시에 초기화를 해주면 된다.

 

메모리 공간의 할당 이후에 생성자의 호출까지 되어야 '객체'라고 할 수 있다.

즉, 객체가 되지 위해서는 반드시 하나의 생성자가 호출되어야 한다.

 

그리고 이러한 기준에 예외를 두지 않기 위해 생성자를 따로 정의하지 않는 클래스는 C++ 컴파일러에 의해

디폴트 생성자(Default Constructor)라는 것이 자동으로 삽입된다.

 

디폴트 생성자는 인자를 받지 않으며, 내부적으로 아무런 일도 하지 않는 생성자이다.

 

즉, 다음의 클래스와

class A
{
private:
	int num; 
public:

};

다음의 클래스 정의와는 동일하다.

class A
{
private:
	int num; 
public:
	A(){ }
};

 

 

소멸자(destructor)는 객체 소멸 시 반드시 호출된다.

또한 클래스의 이름 앞에 '~'가 붙은 형태의 이름을 가진다. 그리고 반환형이 선언되어 있지 않고 매개변수는 void형으로

선언되기에 생성자와 달리 오버 로딩과 디폴트 값 설정이 불가능하다.

 

C++ 생성자와 소멸자

참고로 소멸자도 디폴트 소멸자가 존재한다.

 

-----------------------------------------------------

소멸자는 생성자에서 동적 할당한 메모리 공간을 해제한다.