C++智能指針

引用計數(shù)技術(shù)及智能指針的簡單實現(xiàn)

基礎(chǔ)對象類

class Point

{

public:

    Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { }

    int getX() const
    {
        return x;
    }

    int getY() const
    {
        return y;
    }

    void setX(int xVal)
    {
        x = xVal;
    }

    void setY(int yVal)
    {
        y = yVal;
    }



private:

    int x, y;



};

輔助類

//模板類作為友元時要先有聲明

template <typename T>

class SmartPtr;



template <typename T>

class U_Ptr     //輔助類

{

private:

    //該類成員訪問權(quán)限全部為private餐塘,因為不想讓用戶直接使用該類

    friend class SmartPtr<T>;      //定義智能指針類為友元,因為智能指針類需要直接操縱輔助類



    //構(gòu)造函數(shù)的參數(shù)為基礎(chǔ)對象的指針

    U_Ptr(T *ptr) : p(ptr), count(1) { }



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

    ~U_Ptr()
    {
        delete p;
    }

    //引用計數(shù)

    int count;



    //基礎(chǔ)對象指針

    T *p;

};

智能指針類

template <typename T>

class SmartPtr   //智能指針類

{

public:

    SmartPtr(T *ptr) : rp(new U_Ptr<T>(ptr)) { }     //構(gòu)造函數(shù)

    SmartPtr(const SmartPtr<T> &sp) : rp(sp.rp)
    {
        ++rp->count;    //復(fù)制構(gòu)造函數(shù)
    }

    SmartPtr &operator=(const SmartPtr<T> &rhs)      //重載賦值操作符
    {

        ++rhs.rp->count;     //首先將右操作數(shù)引用計數(shù)加1赘阀,

        if (--rp->count == 0)     //然后將引用計數(shù)減1,可以應(yīng)對自賦值

            delete rp;

        rp = rhs.rp;

        return *this;

    }



    T &operator *()         //重載*操作符

    {

        return *(rp->p);

    }

    T *operator ->()       //重載->操作符

    {

        return rp->p;

    }





    ~SmartPtr()          //析構(gòu)函數(shù)
    {

        if (--rp->count == 0)    //當引用計數(shù)減為0時脑奠,刪除輔助類對象指針基公,從而刪除基礎(chǔ)對象

            delete rp;

        else

            cout << "還有" << rp->count << "個指針指向基礎(chǔ)對象" << endl;

    }

private:

    U_Ptr<T> *rp;  //輔助類對象指針

};

使用測試

int main()

{

    int *i = new int(2);

    {

        SmartPtr<int> ptr1(i);

        {

            SmartPtr<int> ptr2(ptr1);

            {

                SmartPtr<int> ptr3 = ptr2;



                cout << *ptr1 << endl;

                *ptr1 = 20;

                cout << *ptr2 << endl;



            }

        }

    }

    system("pause");

    return 0;

}

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捺信,一起剝皮案震驚了整個濱河市酌媒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迄靠,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喇辽,死亡現(xiàn)場離奇詭異掌挚,居然都是意外死亡,警方通過查閱死者的電腦和手機菩咨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門吠式,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抽米,你說我怎么就攤上這事特占。” “怎么了云茸?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵是目,是天一觀的道長。 經(jīng)常有香客問我标捺,道長懊纳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任亡容,我火速辦了婚禮嗤疯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闺兢。我一直安慰自己茂缚,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脚囊,像睡著了一般帖汞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凑术,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天翩蘸,我揣著相機與錄音,去河邊找鬼淮逊。 笑死催首,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的泄鹏。 我是一名探鬼主播郎任,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼备籽!你這毒婦竟也來了舶治?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤车猬,失蹤者是張志新(化名)和其女友劉穎霉猛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體珠闰,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡惜浅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伏嗜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坛悉。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖承绸,靈堂內(nèi)的尸體忽然破棺而出裸影,到底是詐尸還是另有隱情,我是刑警寧澤军熏,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布轩猩,位于F島的核電站,受9級特大地震影響羞迷,放射性物質(zhì)發(fā)生泄漏界轩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一衔瓮、第九天 我趴在偏房一處隱蔽的房頂上張望浊猾。 院中可真熱鬧,春花似錦热鞍、人聲如沸葫慎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偷办。三九已至艰额,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間椒涯,已是汗流浹背柄沮。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留废岂,地道東北人祖搓。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像湖苞,于是被迫代替她去往敵國和親拯欧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

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

  • 智能指針類 引用計數(shù) 智能指針(smart pointer)的一種通用實現(xiàn)技術(shù)是使用引用計數(shù)(reference ...
    JasonDing閱讀 3,138評論 0 2
  • 導讀## 最近在補看《C++ Primer Plus》第六版财骨,這的確是本好書镐作,其中關(guān)于智能指針的章節(jié)解析的非常清晰...
    小敏紙閱讀 2,004評論 1 12
  • C++智能指針 原文鏈接:http://blog.csdn.net/xiaohu2022/article/deta...
    小白將閱讀 6,864評論 2 21
  • Java面試官經(jīng)常喜歡問關(guān)于垃圾回收的問題。而他最終給出的答案往往是:給對象中添加一個引用計數(shù)器隆箩,每當有一個地方引...
    書呆子的復(fù)仇閱讀 9,083評論 5 9
  • 專屬所有權(quán):unique_ptr 我們大多數(shù)場景下用到的應(yīng)該都是 unique_ptr该贾。 unique_ptr 代...
    wayyyy閱讀 1,224評論 0 1