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

조회수 5337회

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

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

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

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()는 컴파일러에 따라서 다른 결과를 내고 있습니다.

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)