C++ - POD 타입의 기본 초기화
C++ 에서는 변수의 선언이나 new 식에서 생성자에 넘기는 인수가 빈 경우는 인수 리스트를 생략할 수 있다.
class foo {
// 생략
};
int
main(void) {
// ↓ 어느쪽을 사용해도 같다
foo a;
foo b{};
// ↓ 어느쪽을 사용해도 같다
foo *c = new foo;
foo *d = new foo();
return 0;
}
그러나 이 행동에는 예외가 있다. 스칼라 타입과 POD 타입이다.
POD(Plain Old Data)는 간단하게 말하면 C언어의 구조체와 호환성이 있는 타입이다.
#include <iostream>
// POD 타입 정의
class foo {
public:
int data;
};
int main(void) {
static_assert(std::is_pod<foo>::value == true, "foo is not POD"); // 타입 foo 가 POD 타입인 것을 확인
foo a; // 생성자가 호출 되지 않는다
foo b{}; // 생성자가 호출된다
foo *c = new foo; // 생성자가 호출 되지 않는다
foo *d = new foo(); // 생성자가 호출된다
std::cout << a.data << std::endl; // 초기화 되지 않았으므로 알 수 없음.
std::cout << b.data << std::endl; // 0으로 초기화 되어 있다.
std::cout << c->data << std::endl; // 초기화 되지 않았으므로 알 수 없음.
std::cout << d->data << std::endl; // 0으로 초기화 되어 있다.
return 0;
}
정의한 타입이 의도하지 않었지만 POD 요건을 만족한 경우 이 규칙에 의해 초기화에 실수가 발생할 수 있으므로 주의해야 한다.
이 글은 2019-09-26에 작성되었습니다.