1.empty class 在c++處理過後就不再是乙個empty class.編譯器會為它宣告乙個copy 建構函式,乙個copy assignment操作符,乙個析構函式。此外你如果你沒有宣告任何建構函式,編譯器也會為你宣告乙個default建構函式。所有這些函式都是public且inline。
所以:class empty{};
就如同:
class empty empty(const empty& rhs) ~empty() empty& operator=(const empty& rhs) };
唯有當這些函式被呼叫,它們才會被編譯器建立出來。
empty e1; //default 建構函式 //析構函式 empty e2(e1); //copy 建構函式 e2 = e1; //copy assignment操作符
2.default建構函式和析構函式主要是給編譯器乙個地方用來放置「藏身幕後」的**。編譯器產出的析構函式是個non-virtual。除非這個class的base class 自身宣告有virtual 析構函式。
3.copy建構函式和copy assignment操作符,編譯器建立的版本只是單純的將**物件的每個non-static成員變數拷貝到目標物件。
4.copy assignment操作符,其行為基本上與copy建構函式一致,但一般而言,只有當生出的**合發且有適當機會證明它有意義,其表現才如上所述。萬一兩個條件乙個不符合,編譯器會拒絕為class生出operator=。
templateclass namedobject //然後是使用 namedobjectno1("smallest prime number", 2); namedobjectno2(no1); //但是,要是這樣就不行 templateclass namedobject ///如果遇上下面的事 std::string newdog("persephone"); std::string olddog("satch"); namedobjectp(newdog, 2); namedobjects(olddog, 36); p = s; //reference 改指向不同物件是不被允許的,而且還企圖更改const. //所以這是不行的
編譯器可以暗自為class建立default建構函式,copy建構函式,copy assignment操作符,以及析構函式。
條款5 了解C 默默編寫並呼叫哪些函式
這些函式包括 預設建構函式,複製建構函式,賦值建構函式,以及析構函式。這些函式都屬於public部分。但是在有些情況下,賦值建構函式時沒有意義的,此時編譯器就會拒絕構造,舉乙個例子 template class test void print cout 此時,如果你定義了3個test類的物件t1,t...
條款5 了解C 默默編寫並呼叫了哪些函式
編寫的每個類幾乎都有乙個或多個建構函式 乙個析構函式和乙個賦值運算子。這些是編寫乙個類所必需的一些函式,控制著類的基本操作,如產生物件並初始化,以及從系統中排除舊物件並對其進行恰當的清理工作,還有賦予物件新值。在這些函式中出錯帶來很大的負面影響,所以正確地寫好這些函式是十分重要的。這些函式構成了類的...
條款05 了解C 默默編寫並呼叫哪些函式
條款05 了解c 默默編寫並呼叫哪些函式 編譯器可以暗自為class建立default建構函式,copy建構函式,copy assignment操作符,以及析構函式 唯有當這些函式被呼叫,它們才會被編譯器建立出來 include include using std cout using std en...