문제

C++에서 다음 문구는 무엇을 의미합니까?

  • 제로 초기화,

  • 기본 초기화 및

  • 값 초기화

C++ 개발자는 이에 대해 무엇을 알아야 합니까?

도움이 되었습니까?

해결책

깨달아야 할 한 가지는 '가치 초기화'가 C ++ 2003 표준으로 새로운 것이라는 것입니다. 원래 1998 표준에는 존재하지 않습니다 (설명보다 유일한 차이점이라고 생각합니다). 보다 Kirill V. Lyadvinsky의 답변 표준에서 바로 정의.

행동에 대한이 이전 답변을 참조하십시오 operator new 이러한 유형의 초기화의 다른 동작에 대한 자세한 내용과 그들이 시작할 때 (그리고 C ++ 98에서 C ++ 03까지 다를 때) :

답의 주요 요점은 다음과 같습니다.

때때로 새 연산자가 반환 한 메모리가 초기화되며 때로는 새로 워킹하는 유형이 포드인지 또는 포드 멤버가 포함되어 있고 컴파일러 생성 기본 생성자를 사용하는 클래스인지에 따라 다르지 않습니다. .

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

그들이 가장 적게 말하면, 그것은 다소 복잡하고 다른 방법이 시작될 때 미묘합니다.

확실히 알아야 할 것은 MSVC가 VS 2008 (VC 9 또는 CL.EXE 버전 15.x)에서도 C ++ 98 규칙을 따른다는 것입니다.

다음 스 니펫은 MSVC와 디지털 화성이 C ++ 98 규칙을 따르고 GCC 3.4.5와 COMEAU는 C ++ 03 규칙을 따른다는 것을 보여줍니다.

#include <stdio.h>
#include <string.h>
#include <new>

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

int main()
{
    char buf[sizeof(B)];
    memset( buf, 0x5a, sizeof( buf));

    // use placement new on the memset'ed buffer to make sure 
    //  if we see a zero result it's due to an explicit 
    //  value initialization
    B* pB = new(buf) B();   //C++98 rules - pB->m is uninitialized
                            //C++03 rules - pB->m is set to 0
    printf( "m  is %d\n", pB->m);
    return 0;
}

다른 팁

C++03 표준 8.5/5:

에게 제로 초기화 T 유형의 객체는 다음을 의미합니다.
— T가 스칼라 유형(3.9)인 경우 객체는 T로 변환된 0(영) 값으로 설정됩니다.
— T가 공용체가 아닌 클래스 유형인 경우 각 비정적 데이터 멤버와 각 기본 클래스 하위 객체는 0으로 초기화됩니다.
— T가 공용체 유형인 경우 객체의 첫 번째 명명된 데이터 멤버는 0으로 초기화됩니다.
— T가 배열 유형인 경우 각 요소는 0으로 초기화됩니다.
— T가 참조 유형인 경우 초기화가 수행되지 않습니다.

에게 기본 초기화 T 유형의 객체는 다음을 의미합니다.
— T가 POD가 아닌 클래스 유형인 경우(9절) T의 기본 생성자가 호출됩니다(T에 액세스 가능한 기본 생성자가 없으면 초기화는 잘못된 형식입니다).
— T가 배열 유형인 경우 각 요소는 기본적으로 초기화됩니다.
— 그렇지 않으면 객체가 0으로 초기화됩니다.

에게 값 초기화 T 유형의 객체는 다음을 의미합니다.
— T가 사용자 선언 생성자(12.1)가 있는 클래스 유형(9절)인 경우 T의 기본 생성자가 호출됩니다(T에 액세스 가능한 기본 생성자가 없으면 초기화는 잘못된 형식입니다).
— T가 사용자 선언 생성자가 없는 비공용체 클래스 유형인 경우 T의 모든 비정적 데이터 멤버와 기본 클래스 구성 요소는 값으로 초기화됩니다.
— T가 배열 유형인 경우 각 요소는 값으로 초기화됩니다.
— 그렇지 않으면 객체가 0으로 초기화됩니다.

참조 유형 엔터티의 기본 초기화 또는 값 초기화를 요구하는 프로그램은 형식이 잘못되었습니다.T가 cv 정규화된 유형인 경우 T의 cv 정규화되지 않은 버전은 0 초기화, 기본 초기화 및 값 초기화의 정의에 사용됩니다.

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