Effective C 筆記 條款05

2022-03-06 02:46:11 字數 985 閱讀 6300

直接上**:

class empty{};

如果你寫了這樣乙個空類,你沒有宣告任何函式,編譯器會宣告乙個default建構函式、copy建構函式、copy賦值操作符和乙個析構函式。相當於你寫下:

class empty

2:  //default建構函式
5:     empty(const empty& rhs) //copy建構函式
6:     empty& operator=(const empty& rhs)//copy賦值操作符
7:     ~empty()//析構函式
8: };

這些函式的作用:

(1)default建構函式和析構函式:主要是給編譯器乙個地方用來放置「藏身幕後」的**,像是呼叫base classes和non-static成員變數的建構函式和析構函式。注意:編譯器產出的析構函式是non-virtual的,除非這個類的base class自身宣告virtual析構函式。

(2)至於copy建構函式和copy賦值操作符,編譯器建立的版本只是單純地將**物件的每個non-static成員變數拷貝到目標物件。

一般來說,copy賦值操作符和copy建構函式的行為基本上是一致的。但如果你打算在乙個「內含reference成員」的class內支援copy賦值操作符,你必須自己定義它。因為要進行賦值操作,就相當於對reference賦值,但是c++並不允許讓reference改指不同物件,reference初始化後就不能改變了;面對「內含const成員」的class,編譯器的反應也是一樣的,更改const成員是不合法的;還有一種情況:如果base class 將copy賦值操作符宣告為private,編譯器拒絕為其derived classes生成copy賦值操作符,編譯器想要為派生類生成的copy賦值操作符處理base class 成分,但它無法呼叫派生類無權呼叫的成員函式。

總結:(1)編譯器可以自動為class建立default建構函式、copy建構函式、copy賦值操作符,以及析構函式。

Effective C 筆記 條款11

為什麼會出現自我賦值呢?不明顯的自我賦值,是 別名 帶來的結果 所謂 別名 就是 有乙個以上的方法指涉物件 一般而言如果某段 操作pointers或references而它們被用來 指向多個相同型別的物件 就需要考慮這些物件是否為同乙個。實際上兩個物件來自同乙個繼承體系,它們甚至不需要宣告為相同型別...

Effective C 筆記 條款09

為方便採用書上的例子,先提出問題,在說解決方案。class transaction 7 8 transaction transaction base class 的建構函式之實現9 13 14 class buytransaction public transaction 假設在程式中 buytra...

Effective C 筆記 條款08

c 並不禁止析構函式吐出異常,但它不鼓勵你這樣做。考慮如下 class widget 假設這個可能吐出乙個異常5 6 7 void dosomething 8 當vector v被銷毀,它有責任銷毀其內含的所有widgets。銷毀第乙個丟擲異常,銷毀第二個丟擲異常 異常對c 而言太多了。其實,在兩個...