【Geekband】Homework 2

題目為 Rectangle 類實現(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();        
};

設(shè)計思路

01. Big Three Function Design - 三大函數(shù)設(shè)計

1.1 General Constructor - 構(gòu)造函數(shù)
  • private could be omit at the begging of a class.
class MyClass
{
    // for private variables
public:
    // for public interface
protected:
    // for protected functions
}
  • We would prefer to use this
Rectangle(int width, int height)
{
    this->width = width;
    this->height = height;  
}
  • There is a point-to-class pointer and how to build a constructor
// Class
class Point
{
   int x;
   int y;
public:
    Point (int x  = 0, int y =0)
    {
        this->x = x;
        this->y = y;
    }
    int get_x() const {return x;}
    int get_y() const {return y;}
};              
class Rectangle: public Shape
{
   int width;
   int height;
   Point* leftUp; 
public:
   Rectangle(int width, int height, int x, int y);
    ... 
};
// Constructor
Rectangle::Rectangle(int width, int height, int x, int y)
{
     this->width = width;
     this->height = height;
     this->leftUp = new Point(x, y);
}
1.2 Copy Constructor
  • Step 1: 父類Shape的創(chuàng)建在函數(shù)列表中完成,不能使用this->no進行處理。
  • Step 2: 子類的non-pointer成員,也可以在函數(shù)列表中完成
  • Step 3: 子類的pointer成員,必須先檢查是否為nullptr,在依次進行賦值,即深拷貝
Rectangle::Rectangle(const Rectangle& other):
    Shape(other),  // Step 1: father class member
    width_(other.width_),  // Step 2: non-pointer member
    height_(other.height_)
{ 
    if (other.leftUp_ != nullptr)  // Step 3: Check whether other is nullptr
    {
        this->leftUp_ = new Point(*(other.leftUp_));  // Point copy constructor; other.leftUp_ is a (Point* ); so *(other.leftUp_) is a Point.     
    }
    else
        this->leftUp_= nullptr;
}
  • 【思考】此處最對*(other.leftUp_)不是很理解,后續(xù)請教他人后更深入的理解:*就是dereference
    • other.leftUp_ is a Point *
    • *(other.leftUp_) is a Point
    • new Point(?)?是可以接收const Pointer&的內(nèi)容
    • 相比于int等價于
    int number = 1;
    int *number_ptr  = &number;
    int dereferenced = *number_ptr;
    
1.3 Copy Assignment
  • Step 1:先檢查是否是self-assignment
  • Step 2:父類程序按的處理。(這里經(jīng)過查詢書籍,可以知道,直接使用系統(tǒng)默認的copy assignment函數(shù)即可完成任務(wù))
  • Step 3:子類non-pointer成員直接賦值
  • Step 4:檢查pointer等號左右兩側(cè)是否為nullptr,并分別處理
Rectangle& Rectangle::operator=(const Rectangle& other)
{
    if (this == &other) // Step 1:  Self Assignment Check
    {
        return *this;
    }   
    Shape::operator=(other);    // Step 2: Default copy assignment
    this->width_ = other.width_;  // Step 3: General member variables copy
    this->height_ = other.height_; 
    if( other.leftUp_ != nullptr )   // Step 4: Check pointer member
    {
       if( this->leftUp_ != nullptr )
       {
          *(this->leftUp_) = *(other.leftUp_);
       }
       else
       {
          this->leftUp_ = new Point(*other.leftUp_);
       }
    }
    else
    {
       delete this->leftUp_;
       this->leftUp_ = nullptr;
    } 
    return *this;
}
1.4 Destructor
  • General idea is to delete the pointer directly.
Rectangle::~Rectangle()
{
   delete leftUp;
}
  • More safe solution
Rectangle::~Rectangle()
{
   delete leftUp;  // Just release the memory space, but not the value is still an address
   leftUp = nullptr;
}
1.5 inline function
  • The body of an inline fucntion should be in the .h file, otherwise you will get
undefined reference to

總結(jié)

  • 首先理清類之間的相互關(guān)系,一邊后續(xù)設(shè)計三大函數(shù)時,明白各個類成員的來歷。
  • 嚴格按照既定的設(shè)計思路書寫,不能隨心所欲,以免漏寫或畫蛇添足。
  • 處理指針問題要格外小心。

Reference

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,765評論 0 33
  • C++極客班作業(yè)第二題 為Rectangle類實現(xiàn)構(gòu)造函數(shù),拷貝構(gòu)造函數(shù),賦值操作符,析構(gòu)函數(shù)。 class Sh...
    Wanggl閱讀 376評論 0 2
  • Java經(jīng)典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子...
    趙宇_阿特奇閱讀 1,894評論 0 2
  • /*類和對象 1.類和實例化定義類聲明類定義成員函數(shù)數(shù)據(jù)成員的賦值使用類的對象。 2.構(gòu)造函數(shù)數(shù)據(jù)封裝默認構(gòu)造函數(shù)...
    aofeilin閱讀 1,080評論 1 2
  • 周一一早來上班,就聽同事興高采烈告訴大家有一個同事又找到了一份不錯的工作,馬上就要辭工了。 這是近期來我們部門第三...
    梅子Mey閱讀 221評論 0 2