c++ 언어에서 모든 객체는 생성될 때 하나의 생성자가 호출되어야 한다는 규칙이 있다.

이러한 기준에 예외를 두지 않기 위해 생성자가 정의되지 않은 클래스가 있다면 c++ 컴파일러는 디폴트 생성자를 삽입한다. 디폴트 생성자는 아무런 인자도 받지 않으며 아무런 기능도 하지 않는다.

그러므로 아래의 첫번째 예제의 클래스 정의는 두번째 예제의 클래스 정의와 완전히 동일하다.

 
class AAA
{
	private :
		int num;
	public :
		int GetNum() {return num;}
}
 
 
class AAA
{
	private :
		int num;
	public :
		AAA() {} //디폴트 생성자
		int GetNum() {return num;}
}
 

생성자 불일치

상술한 매개변수가 void형으로 선언되는 디폴트 생성자는, 생성자가 하나도 정의되어 있지 않을 때에만 삽입이 된다. 즉, 다음과 같이 정의된 클래스에는 디폴트 생성자가 삽입되지 않는다.

 
class SoSimple
{
	private:
		int num;
	public:
		SoSimple(int n) : num(n) {}
}
 

따라서 다음의 형태로는 객체 생성이 가능하지만,

 
SoSimple simObj1(10);
SoSimple * simPtr1 = new SoSimple(2);
 

다음의 형태로는 객체생성이 불가능하다. void 입력을 받는 생성자가 정의되지도, 자동으로 삽입되지도 않았기 때문이다.

 
SoSimple simObj2;
SoSimple * simPtr2 = new SoSimple;
 

따라서 위의 형태로 객체를 생성하기 원한다면, 다음의 형태로 생성자를 추가해야 한다.

SoSimple() : num(0) {}


동적으로 객체를 할당할 때, new 연산자를 사용하면 생성자가 호출된다.
반면에, malloc은 단순히 클래스의 크기 정보만 바이트 단위로 전달받기 때문에 생성자가 호출될 수 없다. 그러므로 객체를 동적으로 할당하는 경우 반드시 new 연산자를 사용해야 한다.


참고자료

윤성우의_열혈_cpp_프로그래밍