class 에 사용자가 정의한 생성자가 존재할 경우, 두 코드는 완전히 동일한 동작입니다.
그러나 만약 생성자가 없는 경우, new test() 는 디폴트 생성자를 호출하고
new test 는 호출을 하지 않습니다. 말은 호출이지만 사실 요즘 대부분의 컴파일러는
optimize option 을 주지 않아도 기본적으로 inline 코드로 박힙니다.
예를 들어 아래와 같은 코드가 있습니다.
#include
class A{
int a;
public:
int ga(){ return a; }
};
int main()
{
class A *z;
char *p;
p = new char[150];
for( int i = 0; i < 150; i++ )
p[i] = 0x77;
delete[] p;
z = new A;
printf("%08X ",z->ga());
return 0;
}
위의 코드를 g++ (저는 꽤 최신 버전에서 테스트) 빌드해보시면
77777777 이 출력되는 것을 볼 수 있습니다. 초기화 코드가 들어가지 않았다는 얘기입니다.
그러나 위에서 z = new A(); 로 바꾸고 컴파일 해보시면, 00000000 이 출력됩니다.
물론 이는 gcc 기준이고, Visual Studio 는 버전에 따라 차이는 있지만 malloc/free (new/delete) 시에
메모리를 정해진 룰대로 특정한 값으로 초기화를 시켜주기 때문에 77777777 은 뜨지 않을 것입니다.
(물론 쓰레기 값이 뜨는 건 결국 똑같고, A() 로 하면 0이 뜨는 것도 결국 같습니다.)
위는 생성자가 존재하는 경우는 아무런 의미가 없습니다.
가령 A(){ } 를 정의해주고 위처럼 new A , new A() 로 빌드해봐야
당연히 뭘로 빌드를 하든 쓰레기 값이 출력됩니다.
?
class 에 사용자가 정의한 생성자가 존재할 경우, 두 코드는 완전히 동일한 동작입니다.
그러나 만약 생성자가 없는 경우, new test() 는 디폴트 생성자를 호출하고
new test 는 호출을 하지 않습니다. 말은 호출이지만 사실 요즘 대부분의 컴파일러는
optimize option 을 주지 않아도 기본적으로 inline 코드로 박힙니다.
예를 들어 아래와 같은 코드가 있습니다.
#include
class A{
int a;
public:
int ga(){ return a; }
};
int main()
{
class A *z;
char *p;
p = new char[150];
for( int i = 0; i < 150; i++ )
p[i] = 0x77;
delete[] p;
z = new A;
printf("%08X ",z->ga());
return 0;
}
위의 코드를 g++ (저는 꽤 최신 버전에서 테스트) 빌드해보시면
77777777 이 출력되는 것을 볼 수 있습니다. 초기화 코드가 들어가지 않았다는 얘기입니다.
그러나 위에서 z = new A(); 로 바꾸고 컴파일 해보시면, 00000000 이 출력됩니다.
물론 이는 gcc 기준이고, Visual Studio 는 버전에 따라 차이는 있지만 malloc/free (new/delete) 시에
메모리를 정해진 룰대로 특정한 값으로 초기화를 시켜주기 때문에 77777777 은 뜨지 않을 것입니다.
(물론 쓰레기 값이 뜨는 건 결국 똑같고, A() 로 하면 0이 뜨는 것도 결국 같습니다.)
위는 생성자가 존재하는 경우는 아무런 의미가 없습니다.
가령 A(){ } 를 정의해주고 위처럼 new A , new A() 로 빌드해봐야
당연히 뭘로 빌드를 하든 쓰레기 값이 출력됩니다.
이미 답변이 있지 않나요?
https://kldp.org/node/153132
저는 이렇게 생각했습니다.
허탈하군요 ㅎㅎ
허탈하군요 ㅎㅎ
댓글 달기