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에 작성되었습니다.