通過 String 類學(xué)習(xí)的知識

源碼

// string.h
#ifndef __MYSTRING__
#define __MYSTRING__

class String
{
public:                                 
   String(const char* cstr=0);                     
   String(const String& str);                    
   String& operator=(const String& str);         
   ~String();                                    
   char* get_c_str() const { return m_data; }
private:
   char* m_data;
};

#include <cstring>

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()
{
   delete[] 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;
}

inline
String::String(const String& str)
{
   m_data = new char[ strlen(str.m_data) + 1 ];
   strcpy(m_data, str.m_data);
}

#include <iostream>
using namespace std;

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

#endif
// string_test.cpp

   
#include "string.h"
#include <iostream>

using namespace std;

int main()
{
  String s1("hello"); 
  String s2("world");
    
  String s3(s2);
  cout << s3 << endl;
  
  s3 = s1;
  cout << s3 << endl;     
  cout << s2 << endl;  
  cout << s1 << endl;      
}

學(xué)習(xí)到的知識

  • 有指針成員變量的類旺上,一定要有拷貝構(gòu)造函數(shù)粪糙、拷貝賦值函數(shù)、析構(gòu)函數(shù)

原因是如果使用默認(rèn)的鸯两,那么只是淺拷貝闷旧。析構(gòu)函數(shù)是用來析構(gòu)分配的內(nèi)存的。如果不釋放分配的內(nèi)存那么會導(dǎo)致內(nèi)存泄漏的問題钧唐。

  • 在拷貝賦值函數(shù)中一定要檢測鸠匀,這個(gè)值是不是自賦值
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;
}


比如如果是自賦值的話,上面的代碼會把自己的 m_data 釋放掉逾柿,造成錯(cuò)誤的結(jié)果缀棍。

  • delete vs delete[]

釋放的時(shí)候,如果創(chuàng)建的時(shí)候以一種數(shù)組的形式創(chuàng)建的那么一定要 delete[]机错。

  • new 的本質(zhì)

先使用 malloc 分配內(nèi)存爬范,再調(diào)用構(gòu)造函數(shù)

  • delete 的本質(zhì)

先調(diào)用析構(gòu)函數(shù),再釋放分配的內(nèi)存

  • static 的成員變量要給初始值
#include <iostream>

using namespace std;

class Account {
public:
    static double m_rate;
};


int main() {

    Account a;

    cout << a.m_rate << '\n';

    return 0;
}

這樣寫會報(bào)錯(cuò)弱匪。

  • static 成員函數(shù)調(diào)用方法有兩種青瀑,且沒有 this 指針
  1. 通過 object 調(diào)用
  2. 通過 class name 調(diào)用
#include <iostream>

using namespace std;

class A {
public:
    static void foo(){
        cout << "foo" << '\n';
    }
};


int main() {
    A::foo();

    A a;
    a.foo();

    return 0;
}

  • 類模板

就是在類的前面定義一個(gè)模板:

template<typename T>
class XXX{};

然后在類中就可以使用這個(gè)預(yù)定義的 T。比如:

template<typename T>
class Rectangle{
public:
    Rectangle(const T w = 0, const T h = 0):w(w),h(h){}
    T size() {
        return w * h;
    }
private:
    T w, h;
};

然后在使用的時(shí)候指定這個(gè)模板是什么萧诫。比如:

int main() {

    Rectangle<double> r(1.1, 2.2);
    cout << r.size() << '\n';

    return 0;
}

  • 函數(shù)模板

比如最小值(比 go 真的簡單太多了)

#include <iostream>
#include <utility>

using namespace std;

template<class T>
inline
const T& myMin(const T& x, const T& y) {
    return x < y ? x : y;
}


class Stone{
public:
    Stone(const double size, string name):size(size),name(std::move(name)){}
    inline bool operator<(const Stone& s) const {
        return this->size < s.size;
    }
    inline string get_name() const{
        return this->name;
    }

private:
    string name;
    double size;
};

inline ostream& operator<<(ostream& os, const Stone& s) {
    os << s.get_name();
    return os;
}


int main() {
    cout << myMin(1.1, 2.2) << '\n';
    cout << myMin(Stone(10, "min_stone"), Stone(20, "big_stone")) << '\n';

    return 0;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斥难,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子帘饶,更是在濱河造成了極大的恐慌哑诊,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件及刻,死亡現(xiàn)場離奇詭異镀裤,居然都是意外死亡竞阐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門暑劝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骆莹,“玉大人,你說我怎么就攤上這事担猛∧豢眩” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵傅联,是天一觀的道長先改。 經(jīng)常有香客問我,道長纺且,這世上最難降的妖魔是什么盏道? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮载碌,結(jié)果婚禮上猜嘱,老公的妹妹穿的比我還像新娘。我一直安慰自己嫁艇,他們只是感情好朗伶,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著步咪,像睡著了一般论皆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猾漫,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天点晴,我揣著相機(jī)與錄音,去河邊找鬼悯周。 笑死粒督,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的禽翼。 我是一名探鬼主播屠橄,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闰挡!你這毒婦竟也來了锐墙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤长酗,失蹤者是張志新(化名)和其女友劉穎溪北,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刻盐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年掏膏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劳翰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敦锌。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖佳簸,靈堂內(nèi)的尸體忽然破棺而出乙墙,到底是詐尸還是另有隱情,我是刑警寧澤生均,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布听想,位于F島的核電站,受9級特大地震影響马胧,放射性物質(zhì)發(fā)生泄漏汉买。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一佩脊、第九天 我趴在偏房一處隱蔽的房頂上張望蛙粘。 院中可真熱鬧,春花似錦威彰、人聲如沸出牧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舔痕。三九已至,卻和暖如春豹缀,著一層夾襖步出監(jiān)牢的瞬間伯复,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工邢笙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啸如,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓鸣剪,卻偏偏與公主長得像组底,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子筐骇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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