GeekBand C++面向對象高級編程(上)第二周筆記

第二周主要學習的是 class with pointer member,通過以String Class的設計來學習

String類最后要實現(xiàn)如下功能

  String s1 ();
  String s2 ("hello");
  String s3 (s1); // 拷貝構造
  
  s3 = s2; // 拷貝賦值

編譯器會給每個類默認提供拷貝構造和拷貝賦值的函數(shù)书幕,通過一個byte一個byte的拷貝。而對于類中有指針的情況景用,需要自己來實現(xiàn)這兩個函數(shù)杨凑,避免和新產生的對象指向堆中內存的同一個地址

Big Three 三個特殊函數(shù)

class String {
public:
    String(const char* cstr = 0); // 構造函數(shù)
    String(const String& str); // 拷貝構造
    String& operator=(const String& str); // 拷貝賦值
    ~String(); // 析構函數(shù)
    char* get_c_str() const { return m_data; }
private:
    char* m_data;
};

下面來看各個函數(shù)的實現(xiàn)

// 構造函數(shù)
inline String::String(const char *cstr) {
    if (cstr) {
        m_data = new char[strlen(cstr) + 1];
        strcpy(m_data, cstr);
    } else {
        m_data = new char[1];
        *m_data = '\0';
    }
}
// 拷貝構造
inline String::String(const String &str) {
    m_data =  new char(strlen(str.m_data) + 1);
    strcpy(m_data, str.m_data);
}
// 拷貝賦值
inline String &String::operator=(const String &str) {
    if (this == &str) { // 檢測自我賦值
        return *this;
    }

    delete[] m_data;  // 第一步先殺掉自己原有的值
    m_data = new char(strlen(str.m_data) + 1); // 重新分配大小
    strcpy(m_data, str.m_data); // 復制一份值
    return *this;
}
// 析構函數(shù)
inline String::~String() {
    delete[] m_data;
}

最后為了方便輸出String览徒,重載<<操作符

std::ostream& operator << (std::ostream &os, const String &str) {
    os<<str.get_c_str();
    return os;
}

堆突诬、棧 內存管理

{
  Complex c1(1, 2); // 這種方式變量是創(chuàng)建在函數(shù)的棧上的
  Complex* p = new Complex(3); // 創(chuàng)建一個復數(shù),初值是3睦袖,而值是創(chuàng)建在堆上的珊肃,動態(tài)獲得,需要手動釋放
}

stack object 的生命周期:只要離開作用域馅笙,就結束了伦乔。c1便是stack object,又稱為auto object董习,因為它會被『自動』清理
static local object的生命周期:如果在c1前加上static關鍵字烈和,則其在離開作用域后仍然存在,直到整個程序結束
global object 的生命周期:在任何大括號之外的地方聲明的皿淋,也可視為一種static object招刹,在整個程序結束后被清理
heap object 的生命周期:其生命在被delete時結束,如果忘記delete窝趣,將會造成memory leak疯暑,當作用域結束,指針所指向的heap object仍然存在哑舒,但指針的生命已經結束了

new: 先分配memory,再調用ctor

new 操作編譯器將會分解為3個動作缰儿,1. 分配內存 2. 對指針做類型轉換 3. 執(zhí)行構造函數(shù)

delete: 先調用dtor,再釋放memory

delete 操作編譯器將會分解為2個動作,1. 執(zhí)行dtor 2. 釋放內存

補充的知識點

  • static
    類中數(shù)據和函數(shù)前散址,均可添加static關鍵字
    non static member function,編譯器會自動給一個this pointer宣赔,而static member function 是沒有的预麸,所以static member function 不能使用non static member data,只能處理static member data
    static member data 需要申明儒将,static member function的調用可以通過兩種方式 1. 通過class name調用 2. 通過object 調用

通過static來實現(xiàn)單例模式栗子

class A{
public:
    static A& getInstance() {
        static A instance;
        return instance;
    };
    void setup();
private:
    A();
    A(const A& other);
};
A::getInstance().setup();
  • cout
    在c++源碼中發(fā)現(xiàn)吏祸,在ostream中對各種常見的類型做了重載,正是因為如此钩蚊,cout才可以接受那么多種類型并能打印出來

  • class template 和 function template
    之后模板的課程里會詳細講解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末贡翘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子砰逻,更是在濱河造成了極大的恐慌鸣驱,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝠咆,死亡現(xiàn)場離奇詭異踊东,居然都是意外死亡北滥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進店門闸翅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來再芋,“玉大人,你說我怎么就攤上這事坚冀〖檬辏” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵记某,是天一觀的道長司训。 經常有香客問我,道長辙纬,這世上最難降的妖魔是什么豁遭? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮贺拣,結果婚禮上蓖谢,老公的妹妹穿的比我還像新娘。我一直安慰自己譬涡,他們只是感情好闪幽,可當我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涡匀,像睡著了一般盯腌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陨瘩,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天腕够,我揣著相機與錄音,去河邊找鬼舌劳。 笑死帚湘,一個胖子當著我的面吹牛,可吹牛的內容都是我干的甚淡。 我是一名探鬼主播大诸,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贯卦!你這毒婦竟也來了资柔?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤撵割,失蹤者是張志新(化名)和其女友劉穎贿堰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啡彬,經...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡官边,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年沸手,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片注簿。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡契吉,死狀恐怖,靈堂內的尸體忽然破棺而出诡渴,到底是詐尸還是另有隱情捐晶,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布妄辩,位于F島的核電站惑灵,受9級特大地震影響,放射性物質發(fā)生泄漏眼耀。R本人自食惡果不足惜英支,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哮伟。 院中可真熱鬧干花,春花似錦、人聲如沸楞黄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鬼廓。三九已至肿仑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碎税,已是汗流浹背尤慰。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雷蹂,地道東北人割择。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像萎河,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蕉饼,可洞房花燭夜當晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內容