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
'IT' 카테고리의 다른 글
목록의 모든 항목을 파이썬과 함께 곱할 수 있습니까? (0) | 2020.05.19 |
---|---|
open with 문을 사용하여 파일을 여는 방법 (0) | 2020.05.17 |
프로그래밍 방식으로 속성을 어떻게 설정합니까? (0) | 2020.05.17 |
jQuery를 사용한 키보드 단축키 (0) | 2020.05.17 |
AWK 다중 분리 문자 (0) | 2020.05.17 |