IT

C ++ 구조체의 멤버는 기본적으로 0으로 초기화됩니까?

lottoking 2020. 5. 17. 11:11
반응형

C ++ 구조체의 멤버는 기본적으로 0으로 초기화됩니까?


나는 이것을 가지고있다 struct:

struct Snapshot
{
    double x; 
    int y;
};

나는 0이 x되고 싶다. y기본적으로 0이되어야합니까, 아니면해야합니까 :

Snapshot s = {0,0};

구조를 제로화하는 다른 방법은 무엇입니까?


구조체를 초기화하지 않으면 null이 아닙니다.

Snapshot s; // receives no initialization
Snapshot s = {}; // value initializes all members

두 번째는 모든 멤버를 0으로 만들고 첫 번째는 지정되지 않은 값으로 남겨 둡니다. 재귀 적입니다.

struct Parent { Snapshot s; };
Parent p; // receives no initialization
Parent p = {}; // value initializes all members

두 번째는 p.s.{x,y}0이됩니다. 구조체에 생성자가 있으면 이러한 집계 초기화 목록을 사용할 수 없습니다. 이 경우 해당 생성자에 적절한 초기화를 추가해야합니다.

struct Snapshot {
    int x;
    double y;
    Snapshot():x(0),y(0) { }
    // other ctors / functions...
};

x와 y를 모두 0 x(), y()으로 초기화합니다. 유형에 관계없이 초기화하는 데 사용할 수 있습니다 . 그런 다음 값을 초기화하고 일반적으로 적절한 초기 값 (int의 경우 0, double의 경우 0.0, 사용자 정의의 기본 생성자를 호출) 사용자가 생성자를 선언 한 유형, ...). 구조체가 템플릿 인 경우 특히 중요합니다.


아니요, 기본적으로 0이 아닙니다. 모든 값을 유지하거나 기본값을 0으로 설정하는 가장 간단한 방법은 생성자를 정의하는 것입니다

Snapshot() : x(0), y(0) {
}

이렇게하면 모든 Snapshot 사용시 초기화 된 값이 유지됩니다.


일반적으로 아닙니다. 그러나 / scope / 함수에서 file-scope 또는 static으로 선언 된 구조체는 해당 범위의 다른 모든 변수와 마찬가지로 0으로 초기화됩니다.

int x; // 0
int y = 42; // 42
struct { int a, b; } foo; // 0, 0

void foo() {
  struct { int a, b; } bar; // undefined
  static struct { int c, d; } quux; // 0, 0
}


POD로 당신은 또한 쓸 수 있습니다

Snapshot s = {};

C ++에서는 memset을 사용하면 안됩니다. memset에는 구조체에 비 POD가 있으면이를 파괴한다는 단점이 있습니다.

또는 이와 같이 :

struct init
{
  template <typename T>
  operator T * ()
  {
    return new T();
  }
};

Snapshot* s = init();

C ++에서는 인수가없는 생성자를 사용하십시오. C에서는 생성자를 가질 수 없으므로 memset또는 흥미로운 솔루션-지정된 초기화자를 사용하십시오.

struct Snapshot s = { .x = 0.0, .y = 0.0 };

정답은 그 값이 정의되어 있지 않다고 생각합니다. 디버그 버전의 코드를 실행할 때 종종 0으로 초기화됩니다. 릴리스 버전을 실행할 때는 일반적으로 그렇지 않습니다.


이것은 POD (본질적으로 C 구조체)이므로 C 방식으로 초기화하면 거의 해가 없습니다.

Snapshot s;
memset(&s, 0, sizeof (s));

또는 유사하게

Snapshot *sp = new Snapshot;
memset(sp, 0, sizeof (*sp));

calloc()그래도 C ++ 프로그램에서 사용하지는 않을 것 입니다.


포드 멤버를 기본 클래스로 이동하여 이니셜 라이저 목록을 줄이십시오.

struct foo_pod
{
    int x;
    int y;
    int z;
};

struct foo : foo_pod
{
    std::string name;
    foo(std::string name)
        : foo_pod()
        , name(name)
    {
    }
};

int main()
{
    foo f("bar");
    printf("%d %d %d %s\n", f.x, f.y, f.z, f.name.c_str());
}

참고URL : https://stackoverflow.com/questions/1069621/are-members-of-a-c-struct-initialized-to-0-by-default

반응형