Copy構(gòu)造和賦值操作中,復制對象的所有部分

字號:

核心思想:Copy構(gòu)造和賦值操作中,復制對象的所有部分。
    設(shè)計良好的類封裝了內(nèi)部狀態(tài),只有兩個復制函數(shù):Copy構(gòu)造函數(shù)和賦值操作函數(shù)。條款5中談了編譯器合成的復制函數(shù)。
    當類中聲明了Copy構(gòu)造函數(shù)和賦值操作函數(shù),即使有明顯邏輯錯誤,編譯器也不會報錯。Mayers舉了Customer類的例子:如果類中增加了新的成員變量,而沒有更新相關(guān)復制函數(shù),復制函數(shù)只復制對象的部分。
    有繼承時問題更隱蔽。PriorityCustomer Copy構(gòu)造函數(shù)復制了子類成員變量,但是沒有復制基類成員變量。PriorityCustomer類初始化列表中沒有基類Customer,故調(diào)用的是基類缺省構(gòu)造函數(shù)(參見條款5),基類成員變量執(zhí)行的是缺省初始化,而不是復制。對賦值操作函數(shù)情況稍有不同:基類成員變量保持原樣而沒有被賦值。
    解決方案是:同時復制基類部分。一般的,基類成員變量是private的,需要調(diào)用基類對應的復制函數(shù)。
    兩個復制函數(shù)實現(xiàn)很相似,但是讓一個復制函數(shù)調(diào)用另一個是錯誤的做法:
    - 賦值操作函數(shù)調(diào)用Copy構(gòu)造是不合情理的。因為賦值操作函數(shù)是處理一個已經(jīng)存在的對象,所以根本沒有一種語法支持這樣實現(xiàn);
    - Copy構(gòu)造調(diào)用賦值操作也是錯誤的。Copy構(gòu)造函數(shù)初始化新對象,賦值函數(shù)處理已存在對象。將賦值函數(shù)用于未初始化的對象是不正確的。
    如果想消除重復代碼,可以定義一個private成員函數(shù)供兩種調(diào)用。