문제

면'시험'은 평범한 클래스의 차이점이 있습:

Test* test = new Test;

Test* test = new Test();
도움이 되었습니까?

해결책

Let's get 현학적,기 때문에 차이가 있는 것이 실제로 영향을 미치 코드의 동작입니다.훨씬 다음에서 만들어진 의견하는 "Old New Thing"문서.

때로는 메모리 반환에 의해 새로운 작업자가 초기화하고,때로는지 여부에 따라 종류는 당신 newing up 포드(일반전 데이터), 는 경우 또는 그것의 클래스가 포함된 창의 회원을 사용하여 컴파일러에서 생성된 기본 생성자입니다.

  • C++에서 1998 년에 있는 2 종류의 초기화:제고 기본
  • 에서는 C++2003 에서는 3 종류의 초기화 값 초기화가 추가되었습니다.

가정:

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 로 초기화되)

  • new C() -기본 구성(C::m 로 초기화되)

에서는 C++03 규칙을 준수하는 컴파일러는,일을 일해야 한다.

  • new A -확정되지 않은 가치
  • new A() -값 초기화는 제로 초기화 이후 수 있습니다.

  • new B -기본으로 초기화한(잎 B:m 초기화되지 않음)

  • new B() -값 초기화 B 는 제로 초기화 모든 분야 때문에 기본 ctor 은 컴파일러에 의해 생성되는 반대로 사용자 정의됩니다.

  • new C -기본으로 초기화합 C 는 기본 ctor.

  • new C() -값을 초기화합 C 는 기본 ctor.

그래서 모든 버전에서는 C++사이에 차이가 있다 new Anew 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)); - 초기화되지 않습니다.

gotcha는 그 사이에 있습니다.

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

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

아니요, 그들은 동일합니다. 그러나 다음 사이에는 차이가 있습니다.

Test t;      // create a Test called t

그리고

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

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

편집하다: POD 및 비 POD 데이터에 관한 초기화 문제는 말한 모든 것에 동의하지만, 이러한 문제가 새로운 것이 아니거나 다른 방식으로 구성된 것이 사용자가없는 경우에만 적용하고 있다고 지적하고 싶습니다. 정의 된 생성자. 그러한 생성자가 있으면 사용됩니다. 현명하게 설계된 클래스의 99.99%의 경우 그러한 생성자가 있으므로 문제를 무시할 수 있습니다.

일반적으로 우리는 첫 번째 사례에서 기본-시작과 두 번째 경우에는 가치 초기화를 가지고 있습니다.

예를 들면 : int (pod type)의 경우 :

  • int* test = new int - 우리는 초기화가 있고 *테스트의 가치는 그럴 수 있습니다.

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

다음 행동은 유형 테스트에서 의존했습니다. 우리는 defferent 사례를 가지고 있습니다 : 테스트에는 Defult 생성자가 있고, 테스트는 기본 생성자를 생성하고, 테스트는 POD 멤버, 비 POD 멤버 ...

테스트가 정의 된 생성자가있는 클래스라고 가정하면 차이가 없습니다. 후자의 형태는 테스트의 생성자가 실행되고 있음을 조금 더 명확하게 만듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top