new에서 괄호를 붙이고 안 붙이고 차이가 뭔가요?


제가 정의한 Test클래스의 인스턴스를 만들 때

  • Test* test = new Test;
  • Test* test = new Test();

둘 의 차이는 뭔가요? 차이가 있긴 한가요?

  • 2016년 01월 13일에 작성됨

조회수 357


1 답변


좋아요
0
싫어요
채택취소하기

둘은 차이가 있습니다. 코드에 영향을 줄 수 있지요.

newreturn한 메모리는 지금 만드는 objectPOD인지, 아니면 디폴트 생성자(컴파일러)를 쓰는 POD멤버를 갖고 있는지에 따라 어떤 때는 초기화될 수도 있고, 어떨 때는 초기화되지 않을 수도 있습니다.

C++1998에서는 2가지 초기화 방법 : 0default C++2003에서는 3가지 초기화 방법 : 0default, 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() - Avalue 초기화. POD이기 때문에 0으로 초기화
  • new B - 디폴트 초기화. B::m은 초기화되지 않음
  • new B() - Bvalue 초기화. 컴파일러가 만든 디폴트 생성자가 B의 모든 범위를 0으로 만듦
  • new C - C를 디폴트 초기화. 디폴트 생성자가 호출됨
  • new C() - Cvalue 초기화. 디폴트 생성자가 호출됨

정리해보면 A가 POD이기 때문에 모든 버전에서 new A, new A()가 다른 결과를, new B()는 컴파일러에 따라서 다른 결과를 내고 있습니다.

결론을 내면, 괄호를 붙이는 게 어떤 때는 차이가 있지만 어떤 때는 차이가 없을 수도 있고 어떤 때는 상관없는 경우도 있네요.

  • 2016년 01월 13일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close