1. 程式人生 > >w3周日__C++裏有太多微妙到蛋疼的細節。比如構造函數也能搞這麽多幺蛾子

w3周日__C++裏有太多微妙到蛋疼的細節。比如構造函數也能搞這麽多幺蛾子

ons 規則 pil ron 分享 struct 蛋疼 lin 編譯

?問題提出

主要是在VC++ 2015裏經常提示莫名其妙的編譯錯誤。

分析一下,為什麽Java裏構造函數這個問題很簡單:

  1. C++裏對象類型不止有按引用傳遞,還可能拷貝傳遞。所以有時候得提供拷貝構造函數。(這與 重載賦值運算符= 貌似目的是一樣的?都是為了能根據1個instance構造第2個instance)

如果沒顯式自定義一個拷貝構造函數,那麽編譯器默認提供的是“淺拷貝”。所以:當成員變量含對象的指針類型時,必須重寫拷貝構造函數。——> 重寫幾乎成了必然?

2. C++裏有初始值初始化列表 這2種東西。

3. 默認提供的構造函數、拷貝構造函數 還能通過 “= delete” 刪掉。也不知道啥情形下要這麽做。(吐槽:C++把一大堆細節都用語法糖添加到語法裏,使得語法相當的雜,操蛋

4. 雖然C++規範只有一個,但是實現該規範的編譯器又好幾種產品:MSVC, G++, Clang……而且它們各自有一堆版本,對C++標準的支持、增補各不相同,更別說還存在一些靜態代碼檢查的規則也不盡相同,給的提示信息我也經常看不懂……只能拿去Google然後又面臨一堆語法細節,欲仙欲死。。。


? “默認初始化”

1. 如果未顯式提供一個構造函數的話,那麽編譯器會提供一個默認的無參構造函數("default constructor")。

《C++ Primer》:

技術分享圖片

技術分享圖片

還是百度知道好懂點:——> 設計段測試代碼,debug看一下就知道了。

技術分享圖片


?答案在此

技術分享圖片 C/C++變量的自動初始化

w3周日__C++裏有太多微妙到蛋疼的細節。比如構造函數也能搞這麽多幺蛾子