《Effective C++》 讀書筆記之二 構造/析構/指派運算
條款10:令指派(assignment)操作符傳回一個reference to *this。
例子:
1
2
3
4
5
<code>Widget& operator=(</code><code>const</code> <code>Widget& 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& rhs);</code><code>//交換*this與rhs的資料</code>
<code>};</code>
<code>//第一種合理安全的寫法</code>
<code>Widget& Widget::operator=(</code><code>const</code> <code>Widget& 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& funcName);</code>
<code>class</code> <code>Customer{</code>
<code>public</code><code>:</code>
<code> </code><code>Customer(</code><code>const</code> <code>Customer& rhs);.</code>
<code> </code><code>Customer& operator=(</code><code>const</code> <code>Customer& rhs);</code>
<code>private</code><code>:</code>
<code> </code><code>std::string name;</code>
<code>Customer::Customer(</code><code>const</code> <code>Customer& 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& Customer::operator=(</code><code>const</code> <code>Customer& 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& rhs);</code>
<code> </code><code>PriorityCustomer& operator=(</code><code>const</code> <code>PriorityCustomer& rhs);</code>
<code> </code><code>int</code> <code>priority</code>
<code>PriorityCustomer::PriorityCustomer(</code><code>const</code> <code>PriorityCustomer& 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&</code>
<code>PriorityCustomer::operator=(</code><code>const</code> <code>PriorityCustomer& 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