天天看點

C++編譯器默默編寫并調用哪些函數

什麼時候empty class(空類)不再是個empty class呢?當C++處理過它之後,是的,如果你自己沒有聲明,編譯器就會為它聲明(編譯器版本)一個copy構造函數、一個copy assignment操作符和一個析構函數。此外如果你沒有聲明任何構造函數,編譯器也會為你聲明一個default構造函數。所有這些都是public且inline。

編譯器所生成的copy assignment操作符,其行為基本上與copy構造函數如出一轍,但一般而言隻有當生出的代碼合法且有适當機會證明它有意義,編譯器才會生成。

假如,類中存在引用資料成員和const成員,此時就不會生成copy assignment了。因為C++不允許“讓引用改指向不同對象”。

面對這樣的難題,C++的響應是拒絕編譯那一行指派動作。如果你打算在一個“内含引用成員”的class内支援指派操作,你必須自己定義copy assignment 操作符。面對“内含const成員”的classes,編譯器的反應也是一樣的。更改const成員是不合法的,是以編譯器不知道如何在它自己生成的指派函數内面對它們。最後還有一種情況:如果某個base class将copy assignment操作符聲明為private,編譯器将拒絕為其derived class生成一個copy assignment操作符。畢竟編譯器為derived classes所生的copy assignment操作符想象中可以處理base class成分,但它們當然無法調用derived class無權調用的成員函數。編譯器兩手一攤,無能為力。

繼續閱讀