read
struct 를 0 으로 초기화 하려면 다음과 같이 하면 된다. (from : this link)
struct Snapshot { double x; int y ; }; ... Snapshot s; // receives no initialization Snapshot s = {}; // value initializes all members
단 구조체에 constructor 가 선언되어 있지 않을 때만 가능하다. constructor 를 선언한 경우에는 컴파일 에러가 난다. 그리고 대괄호를 이용한 초기화는 recursive 하게 적용이 되는데,
struct Parent { Snapshot s; }; Parent p; // receives no initialization Parent p = {}; // value initializes all members
위 경우 p.s.x 와 p.s.y 모두 초기화가 된다. 구조체 초기화는 위와 같이 대괄호를 이용하거나 constructor 를 이용하여 초기화 한다.
이런 식으로 하지 않고, c 에서 코딩하던 버릇대로 c++ 에서 memset 을 이용하여 zero initialization 을 하는 경우가 있다.
struct Temp { int number; char character; }; void func() { Temp t; memset(&t, 0, sizeof(Temp)); }
결론부터 말하자면 아주 좋지 못한 습관이다. 구조체 관련된 변수들이 메모리상에 연속적으로 존재한다는 가정을하고 있기 때문이다. 만약에 멤버 중에 STL string 이 있다고 한다면,
struct Temp { int number; char character; std::string strvalue; }; void func() { Temp t; memset(&t, 0, sizeof(Temp)); }
memset 이 불려 질 때 std::string object 가 가지고 있던 모든 정보를 잃어버리게 된다.
다시 말해, POD type (Plain Old Data) 로 이뤄진 구조체라면 memset() 을 해도 안전하겠지만, 그 외의 경우에는 문제를 일으키니, memset 을 이용한 초기화는 안 쓰도록 습관을 들이는 것이 좋고, 생성자를 이용한 초기화를 하는 것이 낫다.