나는 이것을 가지고있다 struct
:
struct Snapshot
{
double x;
int y;
};
나는 0이 x
되고 싶다. y
기본적으로 0이되어야합니까, 아니면해야합니까 :
Snapshot s = {0,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, 사용자 정의의 기본 생성자를 호출) 사용자가 생성자를 선언 한 유형, ...). 구조체가 템플릿 인 경우 특히 중요합니다.
Snapshot s = {};
POD 회원이 아닌 사람 (제로화)에게 적용됩니까?
일반적으로 아닙니다. 그러나 / 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();
SomeType foo();
다른 것들과 함께 일어날 수는 있지만 함수 정의 (이 경우에는 foo
을 반환 하는 함수 SomeType
)로 바꿉니다 . 네크로에게 미안하지만 다른 사람이 이걸 우연히 발견하면 내가 대답하겠다고 생각했다.
C ++에서는 인수가없는 생성자를 사용하십시오. C에서는 생성자를 가질 수 없으므로 memset
흥미로운 솔루션으로 지정된 초기화자를 사용하십시오.
struct Snapshot s = { .x = 0.0, .y = 0.0 };
정답은 그 값이 정의되어 있지 않다고 생각합니다. 디버그 버전의 코드를 실행할 때 종종 0으로 초기화됩니다. 릴리스 버전을 실행할 때는 일반적으로 그렇지 않습니다.
0
은 메모리의 해당 위치에 이미 있습니다 . 이것은 초기화와 동일하지 않습니다!
이것은 POD (본질적으로 C 구조체)이므로 C 방식으로 초기화하면 거의 해가 없습니다.
Snapshot s;
memset(&s, 0, sizeof (s));
또는 유사하게
Snapshot *sp = new Snapshot;
memset(sp, 0, sizeof (*sp));
calloc()
그래도 C ++ 프로그램에서 사용하지는 않을 것 입니다.