Programing

유형 이름 뒤의 괄호가 new와 차이가 있습니까?

lottogame 2020. 9. 28. 07:57
반응형

유형 이름 뒤의 괄호가 new와 차이가 있습니까?


'Test'가 일반 클래스이면 다음과 같은 차이점이 있습니까?

Test* test = new Test;

Test* test = new Test();

코드의 동작에 실제로 영향을 미칠 수있는 차이가 있기 때문에 현명 해 봅시다. 다음의 대부분은 "Old New Thing"기사 에 대한 의견에서 가져온 입니다.

때로는 new 연산자에 의해 반환 된 메모리가 초기화되고, 때로는 새로 만드는 유형이 POD (일반 이전 데이터) 인지 또는 POD 멤버를 포함하고있는 클래스 인지 여부에 따라 초기화되지 않을 수 있습니다. 컴파일러 생성 기본 생성자.

  • C ++ 1998에는 0과 기본값의 두 가지 초기화 유형이 있습니다.
  • C ++ 2003에서는 세 번째 유형의 초기화, 값 초기화가 추가되었습니다.

취하다:

struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m

C ++ 98 컴파일러에서 다음이 발생해야합니다.

  • new A -불확실한 값
  • new A() -제로 초기화

  • new B -기본 구성 (B :: m은 초기화되지 않음)

  • new B() -기본 구성 (B :: m은 초기화되지 않음)

  • new C -기본 구성 (C ​​:: m은 0으로 초기화 됨)

  • new C() -기본 구성 (C ​​:: m은 0으로 초기화 됨)

C ++ 03 준수 컴파일러에서는 다음과 같이 작동해야합니다.

  • new A -불확실한 값
  • new A() -value-initialize A, POD이기 때문에 제로 초기화입니다.

  • new B -기본 초기화 (B :: m은 초기화되지 않음)

  • new B() -value-initializes B는 기본 ctor가 사용자 정의가 아닌 컴파일러 생성이므로 모든 필드를 0으로 초기화합니다.

  • new C -default- 기본 ctor를 호출하는 C를 초기화합니다.

  • new C() -값-기본 ctor를 호출하는 C를 초기화합니다.

따라서 모든 버전의 C ++에는 A가 POD이기 때문에 new A사이에 차이가 new A()있습니다.

그리고 경우에 대해 C ++ 98과 C ++ 03 사이의 동작에 차이가 있습니다 new B().

이것은 당신을 미치게 만들 수있는 C ++의 먼지가 많은 부분 중 하나입니다. 객체를 구성 할 때 때로는 괄호를 원하거나 필요로하고, 때로는 절대로 가질 수 없으며 때로는 중요하지 않습니다.


new Thing();생성자가 호출 new Thing;되지 않았더라도 상관하지 않는다는 것을 암시하는 반면 생성자가 호출되기를 원한다는 것은 명시 적입니다 .

사용자 정의 생성자가있는 구조체 / 클래스에서 사용되는 경우 차이가 없습니다. 사소한 구조체 / 클래스 (예 :)에서 호출되면 struct Thing { int i; };다음 new Thing;과 같습니다. malloc(sizeof(Thing));반면 new Thing();에 비슷 calloc(sizeof(Thing));합니다. 0으로 초기화됩니다.

문제는 중간에 있습니다.

struct Thingy {
  ~Thingy(); // No-longer a trivial class
  virtual WaxOn();
  int i;
};

이 경우 new Thingy;vs 의 동작은 new Thingy();C ++ 98과 C ++ 2003 사이에서 변경되었습니다. 방법과 이유는 Michael Burr의 설명을 참조하십시오.


일반적으로 첫 번째 경우에는 기본 초기화가, 두 번째 경우에는 값 초기화가 있습니다.

예 : int (POD 유형)의 경우 :

  • int* test = new int -초기화가 있으며 * test의 값은 임의 일 수 있습니다.

  • int* test = new int() -* test는 0 값을 갖습니다.

다음 동작은 유형 테스트에 따라 다릅니다. 우리는 다른 경우가 있습니다 : 테스트에는 defult 생성자가 있고, 테스트는 기본 생성자를 생성했으며, 테스트에는 POD 멤버, 비 POD 멤버가 포함됩니다 ...


아니요, 동일합니다. 그러나 다음과 같은 차이점이 있습니다.

Test t;      // create a Test called t

Test t();   // declare a function called t which returns a Test

이는 기본 C ++ (및 C) 규칙 때문입니다. 무언가 선언이 될 수 있다면 선언입니다.

Edit: Re the initialisation issues regarding POD and non-POD data, while I agree with everything that has been said, I would just like to point out that these issues only apply if the thing being new'd or otherwise constructed does not have a user-defined constructor. If there is such a constructor it will be used. For 99.99% of sensibly designed classes there will be such a constructor, and so the issues can be ignored.


Assuming that Test is a class with a defined constructor, there's no difference. The latter form makes it a little clearer that Test's constructor is running, but that's about it.

참고URL : https://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name-make-a-difference-with-new

반응형