C++ value initialization

假設有一個 K 線資料結構:

struct K {
    unsigned long time;
    double price;
    double volume;
};

因為此資料結構是 Trivially Copyable,所以可以使用 memset 來初始化:

K k;
if (std::is_trivially_copyable<K>::value) {
    memset(&k, 0, sizeof(K));
}

但如果哪一天我們新增了一個商品名稱成員變數,型態是 std::string:

struct K {
    std::string name;
    unsigned long time;
    double price;
    double volume;
};

突然間此結構就不是 Trivially Copyable,不能用 memset 來初始化了。更糟的是,我們可能會漏修改有使用 memset, memcpy 等函式的地方,導致原本的 code crash。

那有沒有什麼方法解決呢?有的。可以使用 value initialization,也就是使用 () 或是 {} 來初始化物件:

K k{}; // value initialization

這樣 k 就會被正確初始化了。

P.S. 注意!這裡不能使用 () 來初始化,因為會被當成函式宣告。

K k(); 表示宣告一個名稱為 k,沒有參數,回傳值是 K 的函式。

指標也是如法炮製即可:

K* pK = new K;
memset(pK, 0, sizeof(K));

改成

K* pK = new K(); // value initialization

K* pK = new K{}; // value initialization

即可。