Item 12 完整地拷貝物件

2022-05-28 04:39:09 字數 1782 閱讀 5633

在設計良好的物件導向系統中,封裝了物件內部的配件,僅留兩個函式用於物件的拷貝,它們統稱為拷貝函式:拷貝建構函式和拷貝賦值運算子。

考慮乙個象徵消費者的類,這裡的拷貝函式是手寫的,以便將對它們的呼叫記入日誌:

void logcall(const std::string& funcname);       //@ make a log entry

class customer ;

customer::customer(const customer& rhs)

: name(rhs.name) //@ copy rhs's data

customer& customer::operator=(const customer& rhs)

這裡的每一件事看起來都不錯,實際上也確實不錯——直到 customer 中加入了另外的資料成員:

class date ;       //@ for dates in time

class customer ;

在這裡,已有的拷貝函式只進行了部分拷貝:它們拷貝了 customer 的 name,但沒有拷貝它的 lasttransaction。然而,大部分編譯器對此毫不在意,即使是在最高的警告級別。

這個問題最為迷惑人的情形之一是它會通過繼承發生。考慮:

class prioritycustomer: public customer ;

prioritycustomer::prioritycustomer(const prioritycustomer& rhs)

: priority(rhs.priority)

prioritycustomer&

prioritycustomer::operator=(const prioritycustomer& rhs)

prioritycustomer 的拷貝函式看上去好像拷貝了 prioritycustomer 中的每一樣東西,但是每個 prioritycustomer 還包括乙份它從 customer 繼承來的資料成員的副本,而那些資料成員根本沒有被拷貝!

prioritycustomer 的拷貝建構函式沒有指定傳遞給它的基類建構函式的引數,所以,prioritycustomer 物件的 customer 部分被 customer 的建構函式在無引數的情況下初始化——使用預設建構函式。那個建構函式為 name 和 lasttransaction 進行一次預設的初始化。

對於 prioritycustomer 的拷貝賦值運算子,情況有些微的不同。它不會試圖用任何方法改變它的基類的資料成員,所以它們將保持不變。

prioritycustomer::prioritycustomer(const prioritycustomer& rhs)

: customer(rhs), //@ invoke base class copy ctor

priority(rhs.priority)

prioritycustomer&

prioritycustomer::operator=(const prioritycustomer& rhs)

當你寫乙個拷貝函式,需要保證:拷貝所有本地資料成員以及呼叫所有基類中的適當的拷貝函式。

作為一種代替,如果你發現你的拷貝建構函式和拷貝賦值運算子有相似的**,通過建立第三個供兩者呼叫的成員函式來消除重複。這樣的函式當然是 private 的,而且經常叫做 init。

Android listview的item設定高度

在item的layout檔案中,用android layout height設定item的高度。執行,高度設定無效。解決辦法 給item設定minheight,即可.最近一直糾結於listview中每個item中高度的問題,在網上只找出乙個方法,就是在每個item裡面加入,也就是imageview,...

item系列方法

通過中括號取值obj item 觸發它的執行,無論item是否存在。通過中括號賦值obj key value觸發它的執行,無論key是否存在。通過中括號刪除值del obj key 觸發它的執行,無論key是否存在。class dog head 1 def getitem self,item pri...

RecycleView刪除item問題

最近專案做的乙個recycleview。關於刪除item,在adapter裡面使用notityitemremoved 方法遇到的坑 override public void onbindviewholder final commonviewholder holder,final int positi...