Effective C++讀書筆記之十二:複製對象時勿忘其每一個成分

Item 12:Copy all parts of an object

如果你聲明自己的copying函數,意思就是告訴編譯器你並不喜歡缺省顯示中的某些行爲。而編譯器會對“你自己寫出copying函數”做出一種復仇的行爲:既然你拒絕它們爲你寫出copying函數,如果你的代碼不完全,它們也不會告訴你。結論很明顯:如果你爲class添加一個成員變量,你必須同時修改copying函數。如果你忘記,編譯器不太可能提醒你。

一下提供一種正確的模版:

class Date{...};
class Customer
{
public:
	...
private:
	std::string name;
	Date lastTransaction;
};

class PriorityCustomer:public Customer
{
public:
	PriorityCustomer(const PriorityCustomer& rhs);
	PriorityCustomer& operator=(const PriorityCustomer& rhs);
	...
private:
	int priority;
}:

PriorityCustomer::PriorityCustomer(const PriorityCustomer& rhs)
:Customer(rhs),priority(rhs.priority)  //調用base class的copy構造函數
{}

PriorityCustomer& PriorityCustomer::operator = (const PriorityCustomer& rhs)
{
	Customer::operator=(rhs);  //對base class成分進行賦值動作
	priority=rhs.priority;
	return *this;
}

當你編寫一個copying函數,請確保:1.複製所有local成員變量。2.調用所有base classes內的適當的copying函數

這兩個copying函數往往有近似相同的本體,這可能會誘使你讓某個函數調用另一個函數以避免代碼重複。然而這樣做卻無法讓你達到想要的目標。

令copying assignment操作符調用copy構造函數是不合理的,因爲這就像試圖構造一個已經存在的對象。這件事如此荒謬,乃至於根本沒有相關語法。

而令copy構造函數調用copy assignment操作符——同樣沒有意義。構造函數用來初始化新對象,而assignmen操作符只施行與已初始化對象身上。

如果你發現你的copy構造函數和copy assignment操作符有相近的代碼,消除重複代碼的做法是:建立一個新的成員函數給兩者調用。

請記住:

1.copying函數應該確保複製“對象內所有成員變量”及“所有base class成分”。

2.不要嘗試以某個copying函數實現另一個copying函數。應該將所有共同機能放進第三個函數中,並由兩個copying函數共同調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章