您好,登錄后才能下訂單哦!
《Effective C++》 讀書(shū)筆記之二 構(gòu)造/析構(gòu)/賦值運(yùn)算
條款10:令賦值(assignment)操作符返回一個(gè)reference to *this。
例子:
Widget& operator=(const Widget& rhs) { ... return *this;//返回*this }
2016-11-03 09:36:00
條款11:在operator= 中處理“自我賦值”。
例子:
class Widget{ ... void swap(Widget& rhs);//交換*this與rhs的數(shù)據(jù) ... }; //第一種合理安全的寫(xiě)法 Widget& Widget::operator=(const Widget& rhs) { BitMap * pOrg = pb; //記住原先的pb pb = new BitMap(*rhs.pb); //令pb指向*pb的一個(gè)復(fù)件(副本) delete pOrg; //刪除原先的pb return *this; } //第二種合理安全的寫(xiě)法 Widget& Widget::operator=(const Widget& rhs) { Widget temp(rhs); swap(temp); return *this; }
重點(diǎn):
確保當(dāng)對(duì)象自我賦值時(shí)operator= 有良好行為。其中技術(shù)包括比較“來(lái)源對(duì)象”與“目標(biāo)對(duì)象”的地址、精心周到的語(yǔ)句順序、以及copy-and-swap。
確定任何函數(shù)如果操作一個(gè)以上的對(duì)象,而其中多個(gè)對(duì)象是同一個(gè)對(duì)象時(shí),其行為仍然正確。
2016-11-03 10:23:50
條款12:復(fù)制對(duì)象時(shí)勿忘其每一個(gè)成分。Copy all parts of an object.
例子:
void logCall(const std::string& funcName); class Customer{ public: Customer(const Customer& rhs);. Customer& operator=(const Customer& rhs); private: std::string name; }; Customer::Customer(const Customer& rhs) :name(rhs.name) //復(fù)制所有成員,防止局部拷貝(partial copy ) { logCall("Customer copy constructor"); } Customer& Customer::operator=(const Customer& rhs) { logCall("Customer copy assignment operator"); name = rhs.name; return *this; } class PriorityCustmer: public Custmer //一個(gè)derived class { public: PriorityCustomer(const PriorityCustomer& rhs); PriorityCustomer& operator=(const PriorityCustomer& rhs); private: int priority }; PriorityCustomer::PriorityCustomer(const PriorityCustomer& rhs) :Customer(rhs),//調(diào)用base class的copy構(gòu)造函數(shù),如果不調(diào)用,會(huì)調(diào)用Customer的default構(gòu)造函數(shù) priority(rhs.priority) { logCall("PriorityCustomer copy constructor"); } PriorityCustomer& PriorityCustomer::operator=(const PriorityCustomer& rhs) { logCall("PriorityCustomer copy assignment operator"); Customer::operator=(rhs);//對(duì)base class成分進(jìn)行賦值動(dòng)作 priority=rhs.priority; return *this; }
重點(diǎn):
Copying函數(shù)應(yīng)該確保復(fù)制“對(duì)象內(nèi)的所有成員變量”及“所有base class成分”。
不要嘗試以某個(gè)copying函數(shù)實(shí)現(xiàn)另一個(gè)copying函數(shù)。應(yīng)該將共同機(jī)能放進(jìn)第三個(gè)函數(shù)中,比如init(),并由兩個(gè)copying函數(shù)共同調(diào)用。
2016-11-03 11:20:20
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。