溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

《Effective C++》 讀書(shū)筆記之二 構(gòu)造/析構(gòu)/賦值運(yùn)算

發(fā)布時(shí)間:2020-04-05 04:18:00 來(lái)源:網(wǎng)絡(luò) 閱讀:379 作者:313119992 欄目:編程語(yǔ)言

《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):

  1. 確保當(dāng)對(duì)象自我賦值時(shí)operator= 有良好行為。其中技術(shù)包括比較“來(lái)源對(duì)象”與“目標(biāo)對(duì)象”的地址、精心周到的語(yǔ)句順序、以及copy-and-swap。

  2. 確定任何函數(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):

  1. Copying函數(shù)應(yīng)該確保復(fù)制“對(duì)象內(nèi)的所有成員變量”及“所有base class成分”。

  2. 不要嘗試以某個(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


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI