new에서 괄호를 붙이고 안 붙이고 차이가 뭔가요?
조회수 5339회
제가 정의한 Test클래스의 인스턴스를 만들 때
Test* test = new Test;
Test* test = new Test();
둘 의 차이는 뭔가요? 차이가 있긴 한가요?
1 답변
-
둘은 차이가 있습니다. 코드에 영향을 줄 수 있지요.
new
가return
한 메모리는 지금 만드는object
가POD
인지, 아니면 디폴트 생성자(컴파일러)를 쓰는POD
멤버를 갖고 있는지에 따라 어떤 때는 초기화될 수도 있고, 어떨 때는 초기화되지 않을 수도 있습니다.C++1998에서는 2가지 초기화 방법 :
0
과default
C++2003에서는 3가지 초기화 방법 :0
과default
,value
다음과 같은 상황이 있다고 가정하면
struct A { int m; }; // POD(o) struct B { ~B(); int m; }; // POD(x). 컴파일러가 만든 디폴트 생성자를 씀 struct C { C() : m() {}; ~C(); int m; }; // POD(x). m의 디폴트 초기값이 설정되어 있음
C++98 컴파일러에서는
new
는 다음과 같이 쓰입니다.new A
- 값이 정해지지 않음new A()
- 0으로 초기화new B
- 디폴트 생성자.B::m
은 초기화되지 않음new B()
- 디폴트 생성자.B::m
은 초기화되지 않음new C
- 디폴트 생성자.C::m
은 0으로 초기화new C()
- 디폴트 생성자.C::m
은 0으로 초기화
C++03 컴파일러에서는 다음과 같습니다.
new A
- 값이 정해지지 않음new A()
-A
를value
초기화.POD
이기 때문에 0으로 초기화new B
- 디폴트 초기화. B::m은 초기화되지 않음new B()
-B
를value
초기화. 컴파일러가 만든 디폴트 생성자가B
의 모든 범위를 0으로 만듦new C
-C
를 디폴트 초기화. 디폴트 생성자가 호출됨new C()
-C
를value
초기화. 디폴트 생성자가 호출됨
정리해보면 A가
POD
이기 때문에 모든 버전에서new A
,new A()
가 다른 결과를,new B()
는 컴파일러에 따라서 다른 결과를 내고 있습니다.결론을 내면, 괄호를 붙이는 게 어떤 때는 차이가 있지만 어떤 때는 차이가 없을 수도 있고 어떤 때는 상관없는 경우도 있네요.
댓글 입력