C++ 구조체입니다 초기화되었습니다 0 으로 멤버인 기본적으로?

나는 이 '구조체입니다':

struct Snapshot
{
    double x; 
    int y;
};

'X' 와 'y' i want to be 0. 기본적으로 둘 다 0 또는 해야 되죠.

Snapshot s = {0,0};

다른 방법은 어떤 것들이 제로 아웃해야 구조?

Jonny
그는 4년 전 댓글을 달았습니다
0

Std::map&lt 사용하여 >; return 0 시 및 주요 존재하지 않습니다.

답변 8 개

39 don& nulll 않는 경우, t 초기화하지 구조체입니다.

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

모든 멤버가 두 번째 발쿰치로 제로, 첫 번째 찻입) 에서 그들을 미지정을 값. 단, 이는 반복.

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

추신:} {x, y '제로' 두 번째 발쿰치로. 이 경우 전체 초기화, ve got 구성자를 you& 열거합니다 사용할 수 없습니다 # 39 에 구조체입니다. 이런 경우 해당 구성자를 이벤트수정적절한 아니타리제이션 추가할 수 있습니다

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

초기화하지 x 와 y 가 모두 0 으로. 참고 사용할 수 있는 'x (), y ()' 을 그들을 무시하고 초기화하지 그들의 유형: # 39 의 값을 얻을 수 있으며, 일반적으로 다음 that& 초기화하지 적절한 초기 값 (0 은 int, 0.0 이중 부른다 기본 구성자를 사용자 (user defined) 의 경우에는 유형이 구성자를 선언했다. 이 경우 템플리트를 구조체입니다 는 특히 중요하다.

River Williamson
그는 7년 전 댓글을 달았습니다
1

이 옵션을 사용하면 많은 개의경고 내 컴파일러와의.

Kit10
그는 7년 전 댓글을 달았습니다
1

로저: # 39 의 초기화, that& 구조체입니다 release. 사용하려고 합니다, s, t get what I do, I don& # 39 모든 개의경고 VC 에서 2012년: S = 스냅샷입니다 스냅사진의 ();

ontherocks
그는 7년 전 댓글을 달았습니다
0

',' S = {} 는 @johannes 샤우브 레이브 스냅사진의 일하고 비사양 포드 명 (제로화가 그들을 위한)?

ikku100
그는 4년 전 댓글을 달았습니다
2

이제 그들을 초기화하려면 c++11 같은 구조체입니다 또는 클래스를 정의할 수 있습니다. 구조체입니다 스냅샷입니다. { 더블 x {0}; 괄호 //with int y = 0; # 39, & # 39 에서 assignement& //or 그냥 올드 스쿨 스타일. 정말 너무 원하는거요 초기화하지 };

LJH
그는 3년 전 댓글을 달았습니다
0

즉, 흥분됐나요 @ikku100 정말 재밌다

stewbasic
그는 3년 전 댓글을 달았습니다
0

That 's = {} 스냅사진의 건 물론, 3.0' 을 0 으로 3.0 및 스자리 s.스 초기화하지 것으로 보인다. 로만스였나 기술서임을 표준을 준수하는 또는 의존해 구축상의?

Stefan
그는 2년 전 댓글을 달았습니다
1

S = {} 은 &quot 스냅사진의 ";; 부품 표준?

아니, 기본적으로 그들은 0 않습니다. 가장 간단한 방법은 통해 모든 기본 값 또는 0 으로 정의하는 것이 구성자를

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

이렇게 하면 모든 사용하는 스냅샷입니다 초기화되었습니다 값을 가지게 됩니다.

finnw
그는 11년 전 댓글을 달았습니다
24

그러나 그 유형을 갖고 있기 때문에 더 이상 구조체입니다 POD 는 구성자를. 일부 분할합니다 먹어서나 redhat. 임시 파일 등의 작업을 할 것이라고 밝혔다.

Ben Voigt
그는 8년 전 댓글을 달았습니다
15

@finnw: C++11 이 있지만, 이것은 수정, 포드, 표준 layout&quot &quot 구조체입니다 아니다.

그러나 일반적으로 뛰시는군요 로 선언된 함수 / 가 / 초기화되어야 정적임 인할지 구조체입니다 파일 범위 또는 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
}

Hasturkun
그는 11년 전 댓글을 달았습니다
1

39 의 진짜 안 that& 안전한 가정. # 39 너회가 shouldn& 신뢰할 수 있는 가치를 초기화하지 재발했지 아무 것도 없다.

bdonlan
그는 11년 전 댓글을 달았습니다
21

정적 객체는 항상 볼 수 있는 스토리지 기간 zero - # 60707 http://stackoverflow.com/questions/60653/is-global-memory-initialized-in-c/60707 initialized citation) 을 위한 표준. 이런 현상은 표시할지를 스타일이 다른 문제다.

Pod 와 쓸 수도 있습니다

Snapshot s = {};

39, t 는 C++ 언어로 사용할 수 있는 단점이 있습니다 shouldn& 멤세트 멤세트 비사양 포드 구조체입니다 정보기술 (it) 의 경우 폐기합니다 거잖나.

또는 다음과 같습니다.

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

Snapshot* s = init();

Anders
Lightness Races with Monica
그는 9년 전 댓글을 달았습니다
0

[조심하세요 당선자의 가장 애 태우게하는 구문 분석] (http://codepad.org/utBvhcQ5)

Ben Sinclair
그는 5년 전 댓글을 달았습니다
0

@LightnessRacesinOrbit 피타가요 왓?

Nic Hartley
그는 3년 전 댓글을 달았습니다
0

대부분의 애 태우게하는 @andy 구문 분석 등을 통해 일반 스스 섬티페 foo (), '-' 는 것을 보일 수 있지만 일반적인 문제가 발생할 수 있어 한 주셨노라 salesforce. 함수 정의 (이 경우, 반환하는 함수 'foo' '섬티페'). 네크로, 이 사건은 이 문제를 해결할 사람이 구현하므로 I& # 39; d 오토메이티드 신앙이니라 한단다.

C++에서, 아무 인수 구성자를 사용합니다. C # 39 에서 사용할 수 있습니다, 그래서 '또는' 멤세트 구성자를 can& 없다 - - 흥미로운 것은 솔루션이므로 지정된 초기화:

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

jww
그는 5년 전 댓글을 달았습니다
0

이것은 C, C++ 않을 것이라고 생각합니다. 일부 it 페일오버됩니다 asm0001.asm 컴파일하십시오 c++컴파일러는. 내가 경험한 장애로부터의 컴파일하십시오 asm0001.asm 시그윈 또는 MinGW.

이것은 이후 포드 (본질적으로 캜 구조체입니다) 이 C 의 초기화 중 운행에서어떠한 피해를 거의 없다.

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

또는 partnernet

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

39 를 사용하여, 지금까지 내가 wouldn& &lt code&gt, calloc (), t go &lt /code>; c++ 프로그램을 인할지 어쨌든요

Sergey Skoblikov
그는 11년 전 댓글을 달았습니다
5

39 의 이동형이든지 it& 없습니다. 0 포인터입니다 비사양 0 값을 가질 수 있습니다.

finnw
그는 11년 전 댓글을 달았습니다
1

네, 하지만 이 구조체입니다 @sergey 포인터를 포함하고 있지 않습니다.

MSalters
그는 11년 전 댓글을 달았습니다
3

동일한 연산뿐 있다. # 39, 0.0 모든 비트를 제로 isn& 필요는 없다. 그러나 이 경우, 이 경우 두 배로 노력해야 IEEE754 확인할 수 있습니다.

I believe 정답은 그 값은 정의되지 않았습니다. 0 으로 디버그 버전을 실행할 때, 이 코드의 초기화되며 경우가 많습니다. 이 경우 보통 호스팅하면서 릴리스에는 버전.

Lightness Races with Monica
그는 9년 전 댓글을 달았습니다
2

디버그 버전을 이미 해당 위치에서 일이 실제로 그냥 '0' 의 메모리. 초기화 동일합니까 아닙니다!

베이스 클래스 멤버 움직이십시오 포드 줄여집니다 너회의 초기화 목록:

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());
}