天天看點

《Effective C++》 讀書筆記之二 構造/析構/指派運算

《Effective C++》 讀書筆記之二 構造/析構/指派運算

條款10:令指派(assignment)操作符傳回一個reference to *this。

例子:

1

2

3

4

5

<code>Widget&amp; operator=(</code><code>const</code> <code>Widget&amp; rhs)</code>

<code>{</code>

<code>    </code><code>...</code>

<code>    </code><code>return</code> <code>*</code><code>this</code><code>;</code><code>//傳回*this</code>

<code>}</code>

2016-11-03 09:36:00

條款11:在operator= 中處理“自我指派”。

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<code>class</code> <code>Widget{</code>

<code>    </code><code>void</code> <code>swap(Widget&amp; rhs);</code><code>//交換*this與rhs的資料</code>

<code>};</code>

<code>//第一種合理安全的寫法</code>

<code>Widget&amp; Widget::operator=(</code><code>const</code> <code>Widget&amp; rhs)</code>

<code>    </code><code>BitMap * pOrg = pb;        </code><code>//記住原先的pb</code>

<code>    </code><code>pb = </code><code>new</code> <code>BitMap(*rhs.pb);    </code><code>//令pb指向*pb的一個複件(副本)</code>

<code>    </code><code>delete</code> <code>pOrg;                </code><code>//删除原先的pb</code>

<code>    </code><code>return</code> <code>*</code><code>this</code><code>;</code>

<code>//第二種合理安全的寫法</code>

<code>    </code><code>Widget temp(rhs);</code>

<code>    </code><code>swap(temp);</code>

重點:

確定當對象自我指派時operator= 有良好行為。其中技術包括比較“來源對象”與“目标對象”的位址、精心周到的語句順序、以及copy-and-swap。

确定任何函數如果操作一個以上的對象,而其中多個對象是同一個對象時,其行為仍然正确。

2016-11-03 10:23:50

條款12:複制對象時勿忘其每一個成分。Copy all parts of an object.

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

<code>void</code> <code>logCall(</code><code>const</code> <code>std::string&amp; funcName);</code>

<code>class</code> <code>Customer{</code>

<code>public</code><code>:</code>

<code>    </code><code>Customer(</code><code>const</code> <code>Customer&amp; rhs);.</code>

<code>    </code><code>Customer&amp; operator=(</code><code>const</code> <code>Customer&amp; rhs);</code>

<code>private</code><code>:</code>

<code>    </code><code>std::string name;</code>

<code>Customer::Customer(</code><code>const</code> <code>Customer&amp; rhs)</code>

<code>    </code><code>:name(rhs.name) </code><code>//複制所有成員,防止局部拷貝(partial copy )</code>

<code>    </code><code>logCall(</code><code>"Customer copy constructor"</code><code>);</code>

<code>Customer&amp; Customer::operator=(</code><code>const</code> <code>Customer&amp; rhs)</code>

<code>    </code><code>logCall(</code><code>"Customer copy assignment operator"</code><code>);</code>

<code>    </code><code>name = rhs.name;</code>

<code>class</code> <code>PriorityCustmer: </code><code>public</code> <code>Custmer </code><code>//一個derived class</code>

<code>    </code><code>PriorityCustomer(</code><code>const</code> <code>PriorityCustomer&amp; rhs);</code>

<code>    </code><code>PriorityCustomer&amp; operator=(</code><code>const</code> <code>PriorityCustomer&amp; rhs);</code>

<code>    </code><code>int</code> <code>priority</code>

<code>PriorityCustomer::PriorityCustomer(</code><code>const</code> <code>PriorityCustomer&amp; rhs)</code>

<code>    </code><code>:Customer(rhs),</code><code>//調用base class的copy構造函數,如果不調用,會調用Customer的default構造函數</code>

<code>    </code><code>priority(rhs.priority)</code>

<code>    </code><code>logCall(</code><code>"PriorityCustomer copy constructor"</code><code>);</code>

<code>PriorityCustomer&amp;</code>

<code>PriorityCustomer::operator=(</code><code>const</code> <code>PriorityCustomer&amp; rhs)</code>

<code>    </code><code>logCall(</code><code>"PriorityCustomer copy assignment operator"</code><code>);</code>

<code>    </code><code>Customer::operator=(rhs);</code><code>//對base class成分進行指派動作</code>

<code>    </code><code>priority=rhs.priority;</code>

Copying函數應該確定複制“對象内的所有成員變量”及“所有base class成分”。

不要嘗試以某個copying函數實作另一個copying函數。應該将共同機能放進第三個函數中,比如init(),并由兩個copying函數共同調用。

本文轉自313119992 51CTO部落格,原文連結:http://blog.51cto.com/qiaopeng688/1868804

繼續閱讀