實(shí)現(xiàn)一個(gè)類的構(gòu)造函數(shù)草丧,拷貝構(gòu)造函數(shù),析構(gòu)函數(shù)與賦值操作符

搬運(yùn)自大神博客

題目

為下面的Rectangle類實(shí)現(xiàn)構(gòu)造函數(shù)莹桅,拷貝構(gòu)造函數(shù)昌执,賦值操作符烛亦,析構(gòu)函數(shù)。

class Shape
{
     int no;
};

class Point
{
     int x;
     int y;
};

class Rectangle: public Shape
{
     int width;
     int height;
     Point * leftUp;
public:
     Rectangle(int width, int height, int x, int y);
     Rectangle(const Rectangle& other);
     Rectangle& operator=(const Rectangle& other);
     ~Rectangle();
};

解析

構(gòu)造函數(shù)

  1. 盡量使用初始化列表懂拾;
  2. 對leftUp指針的構(gòu)造煤禽,leftUp指向一個(gè)Point對象,構(gòu)造函數(shù)需要在堆內(nèi)生成一個(gè)新的point對象岖赋,并用leftUp指向該對象
inline
Rectangle::Rectangle(int width, int height, int x, int y):width(width),height(height),leftUp(new Point(x,y)){}
//盡量使用初始化列表檬果,包括對leftUp的初始化

拷貝構(gòu)造函數(shù)

  1. 盡量使用初始化列表
  2. 注意對父類繼承而來的no的拷貝構(gòu)造,方法是調(diào)用父類shape的拷貝構(gòu)造函數(shù) Shape(other)
  3. 對this->leftUp的拷貝構(gòu)造唐断,調(diào)用Point的拷貝構(gòu)造函數(shù)选脊,這樣在Point內(nèi)部有變化時(shí),避免大量修改脸甘。
    this->leftUp = new Point(*other.leftUp);
  4. 針對other.leftUp是否為空的討論恳啥,空指針情況沒必要在堆內(nèi)生成對象,同時(shí)當(dāng)other.leftUp為空時(shí)丹诀,this->leftUp初始默認(rèn)是隨機(jī)值钝的,要對他進(jìn)行賦值為空指針。
    完整的拷貝構(gòu)造函數(shù):
inline
Rectangle::Rectangle(const Rectangle& other):Shape(other),width(other.width),height(other.height){
    if(other.leftUp!=NULL)
        this->leftUp = new Point(*other.leftUp);
    else    
        this->leftUp = NULL;
}

賦值操作符

  1. 賦值操作符往往需要首先判定自己給自己復(fù)制的情況忿墅,避免內(nèi)存泄漏
  2. 調(diào)用父類的賦值操作符扁藕,完成對父類繼承部分的賦值操作,方法如下:
    Shape::operator=(other); //調(diào)用父類的賦值操作符疚脐,完成對父類繼承部分的賦值操作
  3. 需要對lefrUp, other.leftUp是否為空進(jìn)行討論
    • other.leftUp為空時(shí)亿柑,直接釋放this->leftUp空間,并將其賦為空即可棍弄;
    • other.leftUp不為空時(shí)望薄,
    • 若this->leftUp也不為空,則直接將other->leftUp指向的內(nèi)容賦值給this->leftUp指向的內(nèi)容即可呼畸;
    • 若this->leftUp為空痕支,創(chuàng)建新的Point對象
Rectangle& Rectangle::operator= (const Rectangle& other){
    if(this == &other){                 //賦值操作符往往需要首先判定自己給自己賦值的情況,避免內(nèi)存泄露 
        return *this;
    }
    Shape::operator=(other);     //調(diào)用父類的賦值操作符蛮原,完成對父類繼承部分的賦值操作 
    this->width = other.width;
    this->height = other.height;

    if(other.leftUp != NULL){
        if(leftUp != NULL) {
            *leftUp = *other.leftUp;             //不必刪除leftUp再重新構(gòu)建卧须,直接進(jìn)行賦值即可(解指針,調(diào)用point類的賦值操作符即可) 
        }
        else{
            leftUp = new Point(*other.leftUp);      //leftUp為空儒陨,不能解指針花嘶,需要?jiǎng)?chuàng)建一個(gè)新對象 
        }
    }
    else{
        delete leftUp; 
        this->leftUp = NULL; 
    }
    return *this;
}

析構(gòu)函數(shù)

Rectangle:: ~Rectangle(){
    delete leftUp;
}

整體代碼和其他注意事項(xiàng)

  1. Rectangle賦值構(gòu)造函數(shù),構(gòu)造順序:先父類蹦漠,后按照子類中聲明的順序椭员,與初始化列表中的順序無關(guān)。
  2. 正確區(qū)分拷貝構(gòu)造函數(shù)和賦值操作符
    拷貝構(gòu)造函數(shù)是構(gòu)造函數(shù)笛园,也就是創(chuàng)建新對象時(shí)隘击,所以一個(gè)對象存在侍芝,一個(gè)對象尚未存在;
    賦值操作符使用時(shí)埋同,兩個(gè)對象必然都是存在的州叠,所以需要討論的問題是是否自我賦值等
  3. 面對此類問題方法:先忘掉語法,畫內(nèi)存模型莺禁,本例即:


    內(nèi)存模型.jpg

    然后寫的時(shí)候分析指針是否為空留量;
    拷貝構(gòu)造就是一邊有,一邊沒有哟冬;賦值操作符就是兩邊都有楼熄。

class Shape
{
     int no;
};

class Point
{
private:
     int x;
     int y;
public:
    Point(int x,int y):x(x),y(y){}
};

class Rectangle: public Shape
{
     int width;
     int height;
     Point* leftUp;
public:
     Rectangle(int width, int height, int x, int y);
     Rectangle(const Rectangle& other);
     Rectangle& operator=(const Rectangle& other);
     ~Rectangle();
};
 
inline 
Rectangle::Rectangle(int width,int heigt, int x,int y):width(width),height(height),leftUp(new Point(x,y)){}  
//盡量使用初始化列表,包括對leftUp的初始化  

inline
Rectangle::Rectangle(const Rectangle& other)
:Shape(other),width(other.width),height(other.height){  // 注意對繼承而來對象no的拷貝構(gòu)造浩峡,通過調(diào)用父類的拷貝構(gòu)造函數(shù) 
    if(other.leftUp != NULL){                         //針對other.leftUp是否為空的討論可岂,空指針情況沒必要在堆內(nèi)生成對象 
        this->leftUp = new Point(*other.leftUp);    //調(diào)用Point的拷貝構(gòu)造函數(shù),這樣在Point內(nèi)部有變化時(shí)翰灾,避免大量修改缕粹。 
    }
    else{
        this->leftUp = NULL;                          //leftUp初始默認(rèn)是隨機(jī)值,要對他進(jìn)行賦值為空指針纸淮。 
    }
}


Rectangle& Rectangle::operator= (const Rectangle& other){
    if(this == &other){                 //賦值操作符往往需要首先判定自己給自己賦值的情況平斩,避免內(nèi)存泄露 
        return *this;
    }
    Shape::operator=(other);     //調(diào)用父類的賦值操作符,完成對父類繼承部分的賦值操作 
    this->width = other.width;
    this->height = other.height;

    if(other.leftUp != NULL){
        if(leftUp != NULL) {
            *leftUp = *other.leftUp;             //不必刪除leftUp再重新構(gòu)建咽块,直接進(jìn)行賦值即可(解指針枷畏,調(diào)用point類的賦值操作符即可) 
        }
        else{
            leftUp = new Point(*other.leftUp);      //leftUp為空卖丸,不能解指針,需要?jiǎng)?chuàng)建一個(gè)新對象 
        }
    }
    else{
        delete leftUp; 
        this->leftUp = NULL; 
    }
    return *this;
} 

Rectangle:: ~Rectangle(){
    delete leftUp;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市披蕉,隨后出現(xiàn)的幾起案子羽莺,更是在濱河造成了極大的恐慌弧蝇,老刑警劉巖欣喧,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異应役,居然都是意外死亡情组,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門箩祥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呻惕,“玉大人,你說我怎么就攤上這事滥比。” “怎么了做院?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵盲泛,是天一觀的道長濒持。 經(jīng)常有香客問我,道長寺滚,這世上最難降的妖魔是什么柑营? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮村视,結(jié)果婚禮上官套,老公的妹妹穿的比我還像新娘。我一直安慰自己蚁孔,他們只是感情好奶赔,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杠氢,像睡著了一般站刑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鼻百,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天绞旅,我揣著相機(jī)與錄音,去河邊找鬼温艇。 笑死因悲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勺爱。 我是一名探鬼主播晃琳,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邻寿!你這毒婦竟也來了蝎土?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绣否,失蹤者是張志新(化名)和其女友劉穎誊涯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒜撮,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡暴构,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了段磨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片取逾。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖苹支,靈堂內(nèi)的尸體忽然破棺而出砾隅,到底是詐尸還是另有隱情,我是刑警寧澤债蜜,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布晴埂,位于F島的核電站究反,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏儒洛。R本人自食惡果不足惜精耐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琅锻。 院中可真熱鬧卦停,春花似錦、人聲如沸恼蓬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滚秩。三九已至专执,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間郁油,已是汗流浹背本股。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桐腌,地道東北人拄显。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像案站,于是被迫代替她去往敵國和親躬审。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容