假設有一個 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
即可。