在C++語言中,默認初始化和值初始化這兩種變數初始化方式都可以呼叫型別的默認建構式,它們的形式非常相似,大部分情況下作用相同,但它們之間存在容易忽視的微小差別,
值初始化的形式為:
T()
new T()
Class::Class(...) : member() {...}
T object{};
T{}
new T{}
Class::Class(...) : member{} {...}
默認初始化的形式為:
T object;
new T
從形式上看,值初始化與默認初始化的唯一區別是值初始化多了一對括號,在很多場合中,這兩種初始化并不會產生什么能被觀察到的區別,那么,下面這兩段代碼,結果有什么區別呢?
int a;
cout << a << endl;
int a{};
cout << a << endl;
在Visual Studio 2019中,第一段代碼產生錯誤C4700(使用了未初始化的區域變數)且無法編譯;關閉SDL檢查之后可以編譯,但運行時會被Runtime check中斷,而第二段代碼會正常運行并輸出0,
參照cppreference.com中的介紹,進行值初始化時:
若T是型別別,
默認建構式非用戶提供且未被洗掉,則會進行零初始化
否則進行默認初始化
若T是陣列型別,則會對陣列的每個成員進行零初始化
若T既不是型別別也不是陣列型別,則對T進行零初始化
而進行默認初始化時:
若T是型別別,則按照多載規則呼叫建構式
若T是陣列型別,則對每個元素進行默認初始化
否則,不做任何事(變數處于未初始化狀態)
所以,對于數值型別,使用默認初始化就等于沒有初始化,對于沒有定義建構式或是建構式沒有進行必要的初始化,且成員變數也沒有定義初始值的型別別也同樣如此,使用沒有初始化的變數是非常危險的,不但會導致意外的結果,而且因為初始值的不確定性導致難以除錯,撰寫代碼時應確保變數在使用前被正確、有效地初始化,而不是被(象征性地)默認初始化,
文章來源: https://www.taoyouh.cn/archives/2061
最后,特別推薦一個分享C/C++和演算法的優質內容,學習交流,技術探討,面試指導,簡歷修改...還有超多原始碼素材等學習資料,零基礎的視頻等著你!
還沒關注的小伙伴,可以長按關注一下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/258036.html
標籤:C++
上一篇:Mybatis入門簡介
