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

즉, 객체가 되기 위해서는 반드시 하나의 생성자가 호출되어야 한다. 그리고 이러한 기중에 예외를 두지 않기 위해서 생성자를 정의하지 않는 클래스에는 C++ 컴파일러에 의해서 디폴트 생성자라는 것이 자동으로 삽입된다.


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


class A

{

int num;


public:

int GetNum(void)

{

return num;

}

};


class A

{

int num;


public:

A() {} //디폴트 생성자.

int GetNum(void)

{

return num;

}

}; 


위의 2개의 클래스는 완전히 동일하다.


따라서, 모든 객체는 한번의 생성자 호출을 동반한다. 이는 new 연산자를 이용한 객체의 생성에도 해당하는 이야기다. 

즉, 위의 클래스를 다음의 형태로 생성해도 객체의 생성과정에서 생성자가 호출된다.

A * ptr = new A;


단, 다음과 같이 new연산자가 아닌, C언어의 malloc 함수를 대신 이용하면 생성자는 호출되지 않는다.

A * ptr = (A*)malloc(sizeof(A));


malloc 함수호출 시, 실제로는 A클래스의 크기정보만 바이트 단위로 전달되기 때문에 생성자가 호출이 되지 않는다.


$ 객체를 동적으로 할당하려는 경우에는 반드시 new 연산자를 이용해야 한다.



생성자 불일치


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


class A

{

int num;


public:

A(int n) : num(n) {} //int형 하나를 인자로 받는 생성자.

};


따라서 다음의 형태로는 객체성성이 가능하다.

A simple(10);

A * simPtr = new A(10);


그러나 다음의 형태로는 개체생성이 불가능하다. 다음 문장에서 요구하는 생성자가 정의되지도, 자동으로 삽입되지도 않았기 때문이다.

A simple;

A * simPtr = new A();


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

A() : num(0) {}

'Programming > C++' 카테고리의 다른 글

소멸자(Destructor)  (0) 2012.05.20
private 생성자  (0) 2012.05.20
이니셜라이저(Initializer)  (0) 2012.05.19
생성자(Constructor)  (0) 2012.05.12
캡슐화  (0) 2012.05.12
Posted by scii
: